控制线程同步的方法

控制同步的方法

  1. (已过时)加锁 synchronized 互斥锁 缺点: 并发效率低下

    synchronized

    synchronized(obj) {  }    对obj加锁的同步代码块
    只有拿到obj锁标记的线程, 才能进入对obj加锁的同步代码块
    ​
    public synchronized void m(){}     对this加锁的同步代码块
    只有拿到obj锁标记的线程,才能调用obj的同步方法
    ​
  2. 锁分级 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();
        }
    }
  3. 锁分段 ConcurrentHashMap 在JDK5-7 ,不对整个Map加锁,而是把Map分成16个片段,对每个片段单独加锁

     

  4. 无锁算法 用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开始,即用无锁算法实现。


 

posted @ 2018-10-07 10:52  ChenPS  阅读(98)  评论(0编辑  收藏  举报