zoukankan      html  css  js  c++  java
  • 控制线程同步的方法

    控制同步的方法

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


  • 相关阅读:
    栈的压入、弹出序列
    HM代码分析--TAppEncoder
    HM代码分析--TAppDecoder
    包含min函数的栈
    GMOJ 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树 林
    【2020.11.5提高组模拟】总结
    dsu on tree学习总结 (树上启发式合并)
    GMOJ 6847. 【2020.11.03提高组模拟】通往强者之路
    2020.11.03【NOIP提高A组】模拟
    【2020.11.02提高组模拟】总结
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9751298.html
Copyright © 2011-2022 走看看