我有一个带有synchronized块的shout()方法。
private void shout(){
System.out.println("SHOUT " + Thread.currentThread().getName());
synchronized(this){
System.out.println("Synchronized Shout" + Thread.currentThread().getName());
try {
Thread.sleep(50);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Synchronized Shout" + Thread.currentThread().getName());
}
}如果我有两个线程运行这个方法,我假设两个“同步的喊叫”总是一个接一个出现,对吗?在"Synchronized Shout“之间不能有其他语句?
发布于 2010-05-03 11:41:15
只要this引用是相同的。如果在两个不同的对象上运行代码,锁将不起作用。
请注意,如果您在this上使用Object.wait而不是调用Thread.sleep来延迟,那么锁将被移除(并在继续之前重新获得)。
发布于 2010-05-03 12:17:25
因为打印“呼喊...”的那行不需要锁,它可以出现在任何地方。因此,即使一个线程持有锁,另一个线程也可能进入并打印"SHOUT...“。
下面的代码显示了交错:
public class Interleave {
public static void main(String[] args) throws Throwable {
Task task = new Task();
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
Thread.sleep(25);
t2.start();
}
private static class Task implements Runnable {
public void run() {
shout();
}
private void shout() {
System.out.println("SHOUT " + Thread.currentThread().getName());
synchronized (this) {
System.out.println("Synchronized Shout " + Thread.currentThread().getName());
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Synchronized Shout " + Thread.currentThread().getName());
}
}
}
}它会打印出来
SHOUT Thread-0
Synchronized Shout Thread-0
SHOUT Thread-1
Synchronized Shout Thread-0
Synchronized Shout Thread-1
Synchronized Shout Thread-1发布于 2010-05-04 09:46:00
当两个或多个线程在同一个实例上运行时,SHOUT可以出现在任何地方,因为它在synchronized块之外,因此不受保护。“同步的呼喊”将始终严格按顺序出现,没有来自另一个线程的同步呼喊介入并影响顺序。
https://stackoverflow.com/questions/2755969
复制相似问题