当我有像
这样的方法时public void unsynchronizedMethod(){
callSynchronizedMethod();
//dosomestuff after this line
}
是否意味着在unynchronizedMethod() - Method中调用callSynchronizedMethod()后,所有内容都是隐式同步的?
答案 0 :(得分:6)
没有。锁定在callSynchronizedMethod()
结束时释放。
答案 1 :(得分:3)
以直接的方式定义同步:
synchronized
方法:在该方法的执行中synchronized
块:在该块的执行中以下是 Java语言规范第3版的相关摘录:
synchronized
Statement
synchronized
声明:
- 代表执行线程
获取互斥锁- 执行一个块,
- 然后释放锁。
醇>当执行线程拥有锁时,没有其他线程可以获取锁。
synchronized
方法在语义上与应用于整个方法的synchronized
语句相同(§JLS 8.4.3.6。锁是从this
获得的(如果它是实例方法)或者与方法类相关联的Class
对象(如果它是static
方法;您不能在this
上下文中引用static
。
所以回答原来的问题,给出了这个片段:
public void unsynchronizedMethod(){
callSynchronizedMethod();
doSomeUnsynchronizedStuff(); // no "implicit synchronization" here
}
请注意,这是设计使然:您应始终尽量将同步最小化到关键部分。在这些关键部分之外,早期同步不会产生挥之不去的影响。
答案 2 :(得分:0)
不,不是。
同步意味着一次只有一个线程会执行代码。
但在callSynchronizedMethod()
之后,线程可以以不同的顺序在代码上再次运行,同时全部在同一时间。
答案 3 :(得分:0)
不,不会有隐式同步。同步在块或函数范围内工作。同步块之外的任何内容都不会同步。
以下示例代码显示了这一点。如果同步的方法总是打印0。
class example extends Thread{
//Global value updated by the example threads
public static volatile int value= 0;
public void run(){
while(true)//run forever
unsynchMethod();
}
public void unsynchMethod(){
synchronizedMethod();
//Count value up and then back down to 0
for(int i =0; i < 20000;++i)
value++;//reads increments and updates value (3 steps)
for(int i = 0; i < 20000;++i)
value--;//reads decrements and updates value (3 steps)
//Print value
System.out.println(value);
}
//Classlevel synchronized function
public static synchronized void synchronizedMethod(){
//not important
}
public static void main(String... args){
example a = new example();
example b = new example();
a.start();
b.start();
}
}
我的结果,如果同步则应为0:
4463
6539
-313
-2401
-3012
...