1、什么是线程安全
多个线程去访问共同容器时可能会产生错误。
2、利用什么方法可以解决:
1)悲观锁:不管有没有高并发,都进行加锁
2)乐观锁:只有发现高并发才进行加锁
3、悲观锁
- synchronized:使用多线程串行的方法,并利用Object wait notify(随机) 上锁、唤醒。
- 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(指定的线程);// 唤醒
网友评论