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


  • 相关阅读:
    常见加密算法概述
    IDEA常见错误解决
    linux Find命令教程
    用注册表更改DNS的代码分享
    关于javascript中的typeof和instanceof介绍
    javascript instanceof,typeof的区别
    Javascript typeof 用法
    浅析JavaScript中的typeof运算符
    玩转Linux文件描述符和重定向
    shell脚本 批量转换目录下文件编码
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9775234.html
Copyright © 2011-2022 走看看