控制线程同步的方法
控制同步的方法
-
(已过时)加锁 synchronized 互斥锁 缺点: 并发效率低下
synchronized
synchronized(obj) { } 对obj加锁的同步代码块 只有拿到obj锁标记的线程, 才能进入对obj加锁的同步代码块 public synchronized void m(){} 对this加锁的同步代码块 只有拿到obj锁标记的线程,才能调用obj的同步方法
-
锁分级 ReadWriteLock 写锁分配时,读锁不能分配;写锁未分配时,读锁可以多次分配
class Vector{ ReadWriteLock rwl = new ReentrantReadWriteLock(); Lock rl = rwl.readLock(); Lock wl = rwl.writeLock(); //写方法 影响集合中数据的状态 public void add(){ wl.lock(); //... wl.unlock(); } public void remove(){ wl.lock(); //... wl.unlock(); } //读方法 获取集合中的数据 public void size(){ rl.lock(); //... rl.unlock(); } public void get(){ rl.lock(); // rl.unlock(); } }
-
锁分段 ConcurrentHashMap 在JDK5-7 ,不对整个Map加锁,而是把Map分成16个片段,对每个片段单独加锁
-
无锁算法 用CAS 比较交换算法实现 ConcurrentHashMap 在JDK8,采用无锁算法
简单理解一下CAS算法,例如:把a =OLD值,替换为a= NEW值
while(true){
n = a;//先把a的OLD值赋值给n
if (a == n) {//在替换为新值之前做一下比较,如果a仍为OLD值,则进行值替换
a = NEW;
break;
}
}
面试中会问线程同步问题,ConcurrentHashMap是从JDK5出现的,在JDK5-7,ConcurrentHashMap 是用分段锁实现,从JDK8开始,即用无锁算法实现。