Kas*_*sra 1 java multithreading synchronized
第1部分:
假设以下代码
void method1(){
synchronized (lockObject){
method2();
System.out.println("line4");
}
}
void method2(){
System.out.println("line1");
synchronized (lockObject){
System.out.println("line2");
}
System.out.println("line3");
}
Run Code Online (Sandbox Code Playgroud)
这是一个僵局吗?这是一个安全的代码吗?输出总是:
line1
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)
第2部分:
如果在另一个线程上执行method2()怎么办?输出会不同吗?像这样:
void method1(){
synchronized (lockObject){
method2();
System.out.println("line4");
}
}
void method2(){
newThread= new Thread(new Runnable() {
@Override
public void run() {
System.out.println("line1");
synchronized (lockObject){
System.out.println("line2");
}
System.out.println("line3");
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)
我猜第二个代码的输出可以是:
line4
line1
line2
line3
Run Code Online (Sandbox Code Playgroud)
它是否正确?
是的,您可以在同一个对象上多次同步而不会出现死锁,它的工作方式就像是重入锁定.
至于输出.第一个是简单的顺序输出,同步不会影响它.第二个将产生预期的输出,因为另一个线程将不得不等待第一个释放lockObject.
编辑,line1和line4的顺序未确定,因为之前没有同步.line2和line3总是在line4之后,因为第二个线程无法开始打印line1,直到第一个线程离开method1同步块.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |