synchronized是Java的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。对于synchronized关键字主要有两个性质:可重入性质和不可中断性质。
什么是可重入呢?指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁。我们举一个例子来说明,一句话吃着碗里的看着锅里的。嘴里面还没吃完就继续再去拿吃的。这就是可重入。不可重入的意思正好相反,你吃完了这碗饭才能盛下一碗。
可重入的程度可以细分为三种情况,我们分别测试一下:
(1)同一个方法中是不是可重入的。就好比是递归调用同步方法。
(2)不同的方法是不是可重入的。就好比是一个同步方法调用另外一个同步方法。
(3)不同的类方法是不是可重入的。
下面我们就是用代码来测试一遍:
(1)同一个方法是不是可重入的
public class SynTest10 {
private int a=1;
public static void main(String[] args) throws InterruptedException {
SynTest10 instance1 = new SynTest10();
instance1.method1();
}
public synchronized void method1() {
System.out.println("method1: a= " + a);
if(a == 3) {
return ;
}else {
a++;
method1();
}
}
}
代码很简单,也就是我们定义了一个变量a,只要a不等于3,就一直递归调用方法method1。我们可以看一下运行结果。
也就是说在同一个方法中是可重入的。
(2)不同的方法是不是可重入的
public class SynTest10 {
public static void main(String[] args) throws InterruptedException {
SynTest10 instance1 = new SynTest10();
instance1.method1();
}
public synchronized void method1() {
System.out.println("method1");
method2();
}
public synchronized void method2() {
System.out.println("method2" );
}
}
我们在同步方法1中调用了同步方法2。我们同样测试一下,method1和method2可以依次输出,说明了在不同的方法中也是可重入的。
(3)不同的类方法是不是可重入的
既然是不同的类,那么我们就在这里定义两个类,一个是Father,一个是Son。我们让son调用father中的方法。
public class Father{
public synchronized void father() {
System.out.println("父亲");
}
}
class Son extends Father{
public static void main(String[] args) {
Son instance1 = new Son();
instance1.son();
}
public synchronized void son() {
System.out.println("儿子");
super.father();
}
}
在这里son类中使用super.father()调用了父类中的synchronized方法,我们测试一下看看输出结果:间接证明了不同的类方法是可重入的。
不可中断的意思你可以这样理解,别人正在打游戏,你也想玩,你必须要等别人不想玩了你才能去。在java中表示一旦这个锁被别人抢走了,你必须等待。等别的线程释放了锁,你才可以拿到。否则就一直等下去。这一点看起来是个有点但其实在某些场景下弊端超级大,因为假如拿到锁得线程永远的不释放,那你就要永远的等下去。
综上所述的2个synchronized关键字的性质,我们发现凡事都有利弊,synchronized关键字的性质很大程度上决定了synchronized关键字的应用场合也决定了它的局限性,但是我们只有在了解了synchronized关键字的性质之后,才能知道synchronized关键字的价值,或许我们可以在动力节点在线的免费视频中发掘更多Java关键字的价值。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54