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


  • 相关阅读:
    altium designer 工程中的原理图库和封装如何提取出来
    555是集成电路
    安装JDK+Tomcat,进行环境变量设置,和运行JSP
    2018年房价会涨吗?
    MySQLroot密码的恢复方法
    mysql中的数据类型长度
    感觉还不错,受益很高,有保障
    phpstorm问题
    Mac上的抓包工具Charles
    解决Firefox显示“已阻止载入混合活动内容”的方法
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9751298.html
Copyright © 2011-2022 走看看