线程安全的实现方法
i. 互斥同步
实现方式:临界区(critical section)、互斥量(Mutex)、信号量(Semaphore)
1. Java中最基本的互斥手段就是:synchronized关键字,经过编译后,会在同步代码前后分别形成monitorenter和monitorexit两个字节码,这两字节码都需要一个reference类型的参数指明要锁定和解锁的对象。如果synchronized指明对象参数,那就是这个对象的reference;若没指明,那就根据修饰的是实例方法还是类方法,去取相应的对象实例或者Class对象来作为锁对象。(就是synchronized后参数)(synchronized是重量级操作)
2. Java.util.concurrent包中的重入锁(ReentrantLock)来实现同步。新加特性:
a) 等待可中断:长期持有锁线程不释放时,等待进程可以选择放弃。
b) 可实现公平锁:(synchronized和lock默认都是非公平的,lock可以通过构造函数中的布尔值要求使用公平锁)
c) 锁可以绑定多个条件:通过多次调用newCondition()方法即可。
3. 二者区别:lock表现为API层面的互斥锁(lock()和unlock()方法需要配合try/finally语句块来完成)。Synchronized变现为原生语法层面的互斥锁。
ii. 非阻塞同步:基于冲突检测的乐观并发策略。(atomicInteger等)
iii. 无同步方案
1. 可重入代码(Reentrant Code)
2. 线程本地存储(Thread Local Storage)
i. 互斥同步
实现方式:临界区(critical section)、互斥量(Mutex)、信号量(Semaphore)
1. Java中最基本的互斥手段就是:synchronized关键字,经过编译后,会在同步代码前后分别形成monitorenter和monitorexit两个字节码,这两字节码都需要一个reference类型的参数指明要锁定和解锁的对象。如果synchronized指明对象参数,那就是这个对象的reference;若没指明,那就根据修饰的是实例方法还是类方法,去取相应的对象实例或者Class对象来作为锁对象。(就是synchronized后参数)(synchronized是重量级操作)
2. Java.util.concurrent包中的重入锁(ReentrantLock)来实现同步。新加特性:
a) 等待可中断:长期持有锁线程不释放时,等待进程可以选择放弃。
b) 可实现公平锁:(synchronized和lock默认都是非公平的,lock可以通过构造函数中的布尔值要求使用公平锁)
c) 锁可以绑定多个条件:通过多次调用newCondition()方法即可。
3. 二者区别:lock表现为API层面的互斥锁(lock()和unlock()方法需要配合try/finally语句块来完成)。Synchronized变现为原生语法层面的互斥锁。
ii. 非阻塞同步:基于冲突检测的乐观并发策略。(atomicInteger等)
iii. 无同步方案
1. 可重入代码(Reentrant Code)
2. 线程本地存储(Thread Local Storage)