資料上說:線程安全問題都是由全局變量及靜態變量引起的。而如果每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
那麼在java中,如何考慮線程同步呢?
java裏一般有2種方法進行同步:同步方法和同步語句塊。
synchronized用於設置同步,它所定的是調用這個同步方法對象,也就是同一個對象在不同線程中執行這個方法時,他們是互斥的,但是這個方法所屬的其他對象可以任意調用這個方法。
下面給出一些參考:
1。同步方法
Public synchronized void methodAAA()
{
//….
}
它等同於下面:
public void methodAAA()
{
synchronized (this) // this是調用這個方法的對象
{
//…..
}
}
2。同步語句塊
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
鎖就是so這個對象,當有一個明確的對象作爲鎖時,就可以這樣寫程序,但當沒有明確的對象作爲鎖,只是想讓一段代碼同步時,可以創建一個特殊的instance變量(它得是一個對象)來充當鎖:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance變量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
3.將synchronized作用於static 函數,示例代碼如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函數
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(類名稱字面常量)
}
}
代碼中的methodBBB()方法是把class literal作爲鎖的情況,它和同步的static函數產生的效果是一樣的,取得的鎖很特別,是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。