java 线程安全的两种方法

2021-12-01  本文已影响0人  是归人不是过客

1、什么是线程安全

多个线程去访问共同容器时可能会产生错误。

2、利用什么方法可以解决:

1)悲观锁:不管有没有高并发,都进行加锁
2)乐观锁:只有发现高并发才进行加锁

3、悲观锁

  1. synchronized:使用多线程串行的方法,并利用Object wait notify(随机) 上锁、唤醒。
  2. ReentrantLock:比synchronized更加灵活,因为notify只能随机唤醒进程。
    利用Condition 进行堵塞和唤醒
 ReentrantLock lock = new ReentrantLock();
        lock.lock(); // 上锁
        Condition condition = lock.newCondition();
        condition.await(); // 堵塞
        condition.signal(); // 唤醒
        lock.unlock(); // 释放锁

4、乐观锁

乐观锁:出现高并发时才加锁(无锁机制)

cas + 自旋

cas做什么:

compare and set 比较和设置
Unsafe 操作系统提供的指令,保证只有一个线程cas能执行成功

自旋:

如果cas发成错误,则不再继续向下执行,通过循环避免后续执行错误

for(;;) {
  cas: 失败  continue
    ....
    }

通过LockSupport进行堵塞和唤醒

LockSupport.park(); // 堵塞
LockSupport.unpark(指定的线程);// 唤醒
上一篇 下一篇

猜你喜欢

热点阅读