打字猴:1.700451131e+09
1700451131
1700451132 //写操作,同时只允许一个写操作
1700451133
1700451134 public void write(Object_obj){
1700451135
1700451136 try{
1700451137
1700451138 w.lock();
1700451139
1700451140 Thread.sleep(1000);
1700451141
1700451142 System.out.println(“Writing……”);
1700451143
1700451144 }catch(InterruptedException e){
1700451145
1700451146 e.printStackTrace();
1700451147
1700451148 }finally{
1700451149
1700451150 w.unlock();
1700451151
1700451152 }
1700451153
1700451154 }
1700451155
1700451156 }
1700451157
1700451158 可以编写一个Runnable的实现类,把Foo类作为资源进行调用(注意多线程是共享这个资源的),然后就会发现这样的现象:读写锁允许同时有多个读操作但只允许有一个写操作,也就是当有一个写线程在执行时,所有的读线程和写线程都会阻塞,直到写线程释放锁资源为止,而读锁则可以有多个线程同时执行。
1700451159
1700451160 (2)Lock是无阻塞锁,synchronized是阻塞锁
1700451161
1700451162 当线程A持有锁时,线程B也期望获得锁,此时,如果程序中使用的是显式锁,则B线程为等待状态(在通常的描述中,也认为此线程被阻塞了),若使用的是内部锁则为阻塞状态。
1700451163
1700451164 (3)Lock可实现公平锁,synchronized只能是非公平锁
1700451165
1700451166 什么叫非公平锁呢?当一个线程A持有锁,而线程B、C处于阻塞(或等待)状态时,若线程A释放锁,JVM将从线程B、C中随机选择一个线程持有锁并使其获得执行权,这叫做非公平锁(因为它抛弃了先来后到的顺序);若JVM选择了等待时间最长的一个线程持有锁,则为公平锁(保证每个线程的等待时间均衡)。需要注意的是,即使是公平锁,JVM也无法准确做到“公平”,在程序中不能以此作为精确计算。
1700451167
1700451168 显式锁默认是非公平锁,但可以在构造函数中加入参数true来声明出公平锁,而synchronized实现的是非公平锁,它不能实现公平锁。
1700451169
1700451170 (4)Lock是代码级的,synchronized是JVM级的
1700451171
1700451172 Lock是通过编码实现的,synchronized是在运行期由JVM解释的,相对来说synchronized的优化可能性更高,毕竟是在最核心部分支持的,Lock的优化则需要用户自行考虑。
1700451173
1700451174 显式锁和内部锁的功能各不相同,在性能上也稍有差别,但随着JDK的不断推进,相对来说,显式锁使用起来更加便利和强大,在实际开发中选择哪种类型的锁就需要根据实际情况考虑了:灵活、强大则选择Lock,快捷、安全则选择synchronized。
1700451175
1700451176 注意 两种不同的锁机制,根据不同的情况来选择。
1700451177
1700451178
1700451179
1700451180
[ 上一页 ]  [ :1.700451131e+09 ]  [ 下一页 ]