线程安全的实现方法

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)
posted on 2017-09-17 18:26  blythe  阅读(248)  评论(0编辑  收藏  举报