Q:如果存在临界(共享)资源,如何保证线程的安全性?
A:加锁,怎么做?不加锁,怎么做?
1、互斥锁
synchronized、Lock(ReentrantLock,ReadWriteLock)
2、非阻塞锁
CAS
Q:CAS真的无锁吗?
A:Java层面:没锁,基于Unsafe实现
底层C++层面: 有锁,lock cmpexchg
3、不采用任何锁
ThreadLocal:让多个线程将共享资源copy到本地,没有多线程操作共享资源的问题
volatile:只要不包含并发对共享数据进行运算,基本没问题。