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
}
1700451077
1700451078
}
1700451079
1700451080
}).start();
1700451081
1700451082
}
1700451083
1700451084
}
1700451085
1700451086
读者可以执行一下,会发现线程名称Thread-0、Thread-1、Thread-2会逐渐输出,也就是一个线程在执行时,其他线程就处于等待状态。注意,这里三个线程运行的实例对象是同一个类(都是Client$1类的实例)。
1700451087
1700451088
那除了这一点不同之外,显式锁和内部锁还有什么不同呢?还有以下4点不同:
[
上一页 ]
[ :1.700451039e+09 ]
[
下一页 ]