标签:允许 final mon 问题: 可重入 long and 资源 默认
线程安全的实现方法。
先来说说几个概念:
1.同步:多线程并发访问共享数据的时候,保证共享数据在同一时刻只能被一个(一些,使用信号量时)线程使用。
2.临界区:每个进程中访问临界资源的那段代码。
3.临界资源:每次仅允许一个进程访问的资源。
4.信号量:相当于一个计数器,每当一个进程使用一个资源,信号量-1;进程释放一个资源,信号量+1;当信号量为0时,进程无法使用该资源。
5.互斥量:信号量的大小为1的情况下,仅有0和1两个值。
一、互斥->同步,在java中的实现方式有synchronized关键字,java.util.concurrent包下的重入锁ReentrantLock。
a.synchronized关键字,利用monitorenter和monitorexit这两个字节码指令,这两个字节码指令都需要一个reference类型参数指明锁定和解锁的对象,而且对于同一条线程来说,同 步块是可重入的,在持有锁线程未执行完之前,其他尝试获取锁的线程阻塞。
b.在功能上很相似,但是在代码写法上,表现为API层面上的互斥锁(lock()和unlock()配合try/finally语句块来完成),并且增加了高级功能:
①等待可中断,持有锁的线程长期不释放锁,等待的线程可以选择放弃等待。
②可以再构造方法上设置true,实现公平锁,默认非公平锁。
③锁可以绑定多个条件,一个ReentrantLock对象可以绑定多个Condition对象。
注:jdk1.5之前在随着线程数量增多,synchronized性能下降严重,1.6之后性能大约一致。其主要问题是线程阻塞和唤醒所带来的性能问题。
二、非阻塞->同步,采用乐观并发策略,先对共享变量进行操作,如果没有其他线程争用,则操作成功;否则,采用其他补偿措施。
依赖与硬件:操作和冲突检测两个步骤具有原子性。
java1.5后操作有sun.misc.unsafe类中的compareAndSwapInt()和compareAndSwapLong()提供,这个只能有Bootstrap ClassLoader加载,可以同过juc中的atomicInt类来间接调用。
但可能会发生“ABA”问题,但一般不会对程序结果产生影响。
注:“ABA”问题:在程序取值期间另一个线程更改又改回,线程无法判断。
三、volitile 写累了,待会再写。
标签:允许 final mon 问题: 可重入 long and 资源 默认
原文地址:http://www.cnblogs.com/rookie111/p/7544760.html