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

    控制同步的方法

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


  • 相关阅读:
    Beginning Python From Novice To Professional读书笔记
    Google's Python Class
    Screen scraping 3
    Screen scraping 1
    Screen scraping 2
    《发现你的销售力量》读书笔记
    不可思议的每日培训
    “项目计划与跟踪最佳实践”讲座(2010年7月)现接受企业申请
    “活用类图,把握需求主动权”讲座(2010年6月)现接受企业申请
    项目健康状况检查
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9775234.html
Copyright © 2011-2022 走看看