1700451027
1700451028
线程名称:pool-2-thread-3,执行时间:45 s
1700451029
1700451030
线程名称:pool-2-thread-2,执行时间:47 s
1700451031
1700451032
––TaskWithSync任务执行完毕–—
1700451033
1700451034
注意看运行的时间戳,显式锁是同时运行的,很显然在pool-1-thread-1线程执行到sleep时,其他两个线程也会运行到这里,一起等待,然后一起输出,这还具有线程互斥的概念吗?
1700451035
1700451036
而内部锁的输出则是我们的预期结果:pool-2-thread-1线程在运行时其他线程处于等待状态,pool-2-thread-1执行完毕后,JVM从等待线程池中随机获得一个线程pool-2-thread-3执行,最后再执行pool-2-thread-2,这正是我们希望的。
1700451037
1700451038
现在问题来了:Lock锁为什么不出现互斥情况呢?
1700451039
1700451040
这是因为对于同步资源来说(示例中是代码块),显式锁是对象级别的锁,而内部锁是类级别的锁,也就是说Lock锁是跟随对象的,synchronized锁是跟随类的,更简单地说把Lock定义为多线程类的私有属性是起不到资源互斥作用的,除非是把Lock定义为所有线程的共享变量。都说代码是最好的解释语言,我们来看一个Lock锁资源的代码:
1700451041
1700451042
public static void main(String[]args){
1700451043
1700451044
//多个线程共享锁
1700451045
1700451046
final Lock lock=new ReentrantLock();
1700451047
1700451048
//启动三个线程
1700451049
1700451050
for(int i=0;i<3;i++){
1700451051
1700451052
new Thread(new Runnable(){
1700451053
1700451054
@Override
1700451055
1700451056
public void run(){
1700451057
1700451058
try{
1700451059
1700451060
lock.lock();
1700451061
1700451062
//休眠2秒钟
1700451063
1700451064
Thread.sleep(2000);
1700451065
1700451066
System.out.println(Thread.currentThread().getName());
1700451067
1700451068
}catch(InterruptedException e){
1700451069
1700451070
e.printStackTrace();
1700451071
1700451072
}finally{
1700451073
1700451074
lock.unlock();
1700451075
1700451076
}
[
上一页 ]
[ :1.700451027e+09 ]
[
下一页 ]