ReentrantLock与synchronized

来源:互联网 发布:python 输出汉字乱码 编辑:程序博客网 时间:2024/06/12 22:16

Synchronized确保变量在内存的可见性 - 即当读写两个线程同时访问同一个变量时,synchronized用于确保写线程更新变量后,读线程再访问该变量时可以读取到该变量最新的值。因为根据“对一个监视器的解锁操作happens-before于每一个后续对同一个监视器的加锁操作。”

锁不仅仅是关于同步于互斥的,也是关于内存可见性的。


无锁框架Amino:氨基酸

Amino是Apache的一个子项目,它提供了线程安全的,基于无锁的数据结构。

LockFreeList,LockFreeVector,LockFreeSet,树,图,等。


 ReentrantLock在Java5时比synchronized有明显的性能优势,在Java6以后差异不大。

锁持有的时间越长,锁竞争程度越激烈。因此有必要减少锁时间,减小锁粒度。

ReentrantLock提供了公平与非公平锁(通过construct指定),非公平的性能好很多。Synchronized不是公平锁。

1)lock(), 拿不到lock就不罢休,不然线程就一直block。比较无赖的做法。

2)tryLock(),马上返回,拿到lock就返回true,不然返回false。比较潇洒的做法。

带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false。比较聪明的做法。

ReadWriteLock:

传统的锁ReentrantLock,Synchronized均是串化的,当一个对象既有读,又有些操作时, ReadWriteLock解决了这个问题,当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。

Condition:是与ReentrantLock关联的,通过Lock的newCondition()生成一个与锁绑定的Condition对象。在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现。

http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition

Semaphore:可以指定semaphore的数量以及是否公平。Acquire,release;

ThreadLocal:线程本地变量,线程局部变量,与线程相关的对象。

 

锁粗化:Lock Coarsening:

当同一个线程对同一个所快速不同请求,同步,释放时,本身会消耗很多系统资源,需粗化锁。

锁自旋:Spinning Lock:

线程切换非常耗时,自旋锁在线程未取得锁时,不被挂起,而去做一些空循环(自旋),若干空自旋后若还不能取得锁,才会挂起。JVM通过-XX:+UseSpinning,PreBlockSpin打开自旋与自旋多少次。

 

锁消除:Lock Elimination:

JVM在即时编译时,通过上下文得知不会存在资源竞争,就可能消除一些如StringBuilder,Vector的同步。-XX:+Eliminate


原创粉丝点击