我有一個方法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」之間不能有其他陳述?
然後我不明白同步塊的重點。 – unj2 2010-05-03 16:45:41
@ kunjaan同步的確提供了「互斥」。但非常重要的一點是,互斥僅限於參與同一鎖定的線程。任何不參與相同鎖的線程的進度都不受影響。因此,執行不需要獲取相同鎖的代碼區域的任何線程(例如打印位於同步塊之外的「SHOUT ...」的行)根本不受鎖定的影響。同理,任何嘗試獲取不同對象鎖的線程也不會受到影響(Tom Hawtin指出)。 – sjlee 2010-05-03 16:52:51