問:當定義了方法A和方法B,當實例化類后,多線程如何保證調用方法A時方法B即使被調用也不會被執行?Java有保證這種機制的關鍵字嗎?
答:用 synchronized
修飾方法 例如:
public class O
{
public synchronized void A(){}
public synchronized void B(){}
}
同一個類中的所有synchronized修飾的方法是不能同時調用的,也就是說同時只能調用其中一個方法,比如線程1調用A方法,在A方法執行完之前,線程2調用B方法,這個時候線程2就會阻塞,直到線程1調用完A方法后,線程2才開始執行B方法!
還有一個解決方法就是加一個同步對象鎖
public class O
{
Object lock;
public void A()
{
synchronized(lock)
{
//這里寫方法內容
}
}
public void B()
{
synchronized(lock)
{
//這里寫方法內容
}
}
}
注意:同一個類中所有的同步的靜態方法,它們在類范圍類是同步的,也就是同一時間只能有一個線程可以訪問所有同步靜態方法中的一個。
不同類中的靜態同步方法互不影響。前面所說,靜態同步方法是類級別的,也就是以類為單位進行控制的。如果兩個線程訪問不同類中的同步方法,這兩個線程是不需要等待的,即使是靜態方法。