并发编程常见知识点考察
- 平时业务中使用过多线程吗,能举例几个多线程的业务场景吗?
异步任务: 用户注册,记录日志
定时任务: 定期备份日志、备份数据库
分布式计算: Hadoop处理任务MapReduce、master-Wark(单机单进程)
服务器编程: Socket网络编程,一个连接一个线程
HashMap ArrayList LinkList
加锁,比如synchronize、ReentranLock
使用volatile申明变量,轻量级同步,不能保证原子性(需要解释)
使用线程安全类(原子类AtomicXXX,并发容器,同步容器CopyOnWriteArrayList、ConcurrentHashMap)等
ThreadLocal本地私有变量、信号量Senaphore等
- 了解volatile关键字?能否解释下,然后和sychronzed有什么大区别
volatile是轻量级的sychronized,volatile修饰的变量,能保证共享变量的可见性,被volatile修饰的变量,
如果发现变化,其他线程立即可见,避免脏读的现象
volatile:保证可见性,但不能保证原子性
synchronize:保证可见性,也保证原子性
1、不能修饰写入操作依赖当前值的变量,比如num++、num=num+1,不是原子操作,肉眼看起来是
但是JVM字节码层不止一步。
2、由于禁止了指令重排序,所以JVM相关的优化没了,效率会偏弱。
JAVA内存模型简称 JMM
JMM规定所有的变量存在主内存,每个线程都有自己的工作内存,线程对变量的才做都是工作内存中进行,不能直接对主内存进行操作
使用volatile修饰变量
每次读取钱必须从主内存属性获取最新的值
每次写入需要立刻写入主内存中
voliate关键字修饰的变量随时看到自己的最新值,假如线程1变量对变量v进行修改,那么线程2
是可以马上看见的
