lock和synchronized的不同:
synchronized获得锁和释放的方式都是在块结构中,当获取多个锁的时候必须以相反的顺序释放,并且是自动解锁。
Lock是JDK1.5以后引进的,它相比synchronized关键词要更灵活,可用范围更广泛。
用法:
我们来看一个计数器的例子来比较这两者的不同:
1. synchronized
1 2 3 4 5 6 7 8 9 10 11 | publicclassCounter {
privateintcount =0;
publicintinc() { synchronized(this) { return++count; } } }
|
//加了synchronized关键词后,count每次在块中只能被同一个进程加数。
//我们再来看下使用 Lock是如何实现的
2. Lock
1 2 3 4 5 6 7 8 9 10 11 | publicclassCounter {
privateLock lock =newLock(); privateintcount =0;
publicintinc() { lock.lock(); intnewCount = ++count; lock.unlock(); returnnewCount; } }
|
//从调用Lock方法之后lock的实例就被锁定,直道被调用unlock才解锁。
性能比较:
下面是在我电脑上跑出的结果:
Threads | 1x | 1x | 1x | 2x | 2x | 2x |
1 | 1.797 | 2.175 | 0.947 | 3.246 | 4.111 | 1.703 |
2 | 8.685 | 4.134 | 1.889 | 13.144 | 4.901 | 1.949 |
4 | 7.942 | 3.040 | 1.735 | 13.182 | 4.960 | 1.945 |
8 | 7.648 | 3.011 | 1.894 | 13.287 | 4.979 | 1.951 |
16 | 8.017 | 2.974 | 1.735 | 13.040 | 4.573 | 1.950 |
32 | 7.908 | 2.958 | 1.777 | 13.059 | 4.845 | 1.958 |
64 | 7.853 | 2.972 | 1.878 | 13.316 | 5.004 | 1.954 |
从结果上看,当线程数越多时Lock的效率越高。