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


  • 相关阅读:
    [译]rabbitmq 2.1 Consumers and producers (not an economics lesson)
    mysql存储过程执行权限问题
    修改linux端口范围 ip_local_port_range
    centos6 自启动任务
    randomize_va_space
    linux 捕获信号处理中遇到的死锁
    squid基础配置
    [转]你应该了解的 一些web缓存相关的概念
    libevent简介 构成
    Libevent windows/linux下编译
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9775234.html
Copyright © 2011-2022 走看看