Earyant的技术博客

欢迎来到Earyant的技术博客,在这里我将与你分享新技术。

java并发锁

实现方式


  • -[ ] 公平锁
    -[ ] 非公平锁
    • 隐式锁Synchronized
    • 显式锁Lock
      • ReentrantLock
      • ReadWriteLock
      • ReentrantReadWriteLock
      • StampedLock
  • 无锁
    • atomic
    • concurrent
    • blocking
    • threadLocal
    • volatile
    • CAS

  • Synchronized
    1
    2
    3
    4
    5
    6
    7
    8
    public class Counter{
    private int count = 0;
    public int inc(){
    synchronized(this){
    return ++count;
    }
    }
    }
  • Lock
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Counter{
    private Lock lock = new Lock();
    private int count = 0;
    public int inc(){
    lock.lock();
    int newCount = ++count;
    lock.unlock();
    return newCount;
    }
    }
    不可重入自旋锁的简单实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Counter{
    public class Lock{
    private boolean isLocked = false;
    public synchronized void lock()
    throws InterruptedException{
    while(isLocked){
    wait();
    }
    isLocked = true;
    }
    public synchronized void unlock(){
    isLocked = false;
    notify();
    }
    }}

threadLocal

如果想知道为什么使用ThreadLocal,就得先了解局部变量和全局变量对线程安全的影响。
局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。
当多个线程引用同一个对象时,因为对象引用是放在栈上的,但是对象实例存储在堆中,所以不是线程安全的。

ThreadLocal就是拷贝一份到线程缓存中,Thread正是操作这个对象,就不会出现安全问题。

  • InheritableThreadLocal

    InheritableThreadLocal类是ThreadLocal的子类。为了解决ThreadLocal实例内部每个线程都只能看到自己的私有值,所以InheritableThreadLocal允许一个线程创建的所有子线程访问其父线程的值。

欢迎关注我的其它发布渠道