概念:
synchronized 用來做執行緒同步;
物件鎖 與 類鎖:
synchronized加到非靜態方法或**塊時,給物件加鎖,多個執行緒執行該物件的同步方法會互斥
多個物件執行物件中的同步方法不會互斥。
synchronized加到靜態方法或類時,鎖的是這個類,多個執行緒多個物件執行物件中的同步方法時都會互斥
對以上說明通過**來演示以便方便理解。
1.驗證修飾非靜態方法
public class synchronizedtest
}).start();
new thread(new runnable()
}).start();
}public synchronized void test1() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " : " + i);}}
}
public class synchronizedtest
}).start();
new thread(new runnable()
}).start();
}public synchronized void test1() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " : " + i);}}
public synchronized void test2() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " : " + i);}}
}}
執行結果相同如下:
表名:兩個執行緒執行的同一物件中的同步方法(同步**塊),會互斥,兩個執行緒執行的同一物件中兩個不同的同步方法(同步**塊),還是會互斥
public class synchronizedtest
}).start();
new thread(new runnable()
}).start();
}public synchronized void test1() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " : " + i);}}
}
執行結果相同如下:
表名:兩個執行緒分別執行不同物件中的同步方法(同步**塊)不會互斥。
總結:說明synchronized修飾非靜態方法(**塊)時,是給物件加鎖。
2.驗證修飾靜態方法
public class synchronizedtest
}).start();
new thread(new runnable()
}).start();
}public static synchronized void test1() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + " : " + i);}}
}
執行結果如下:
表名:兩個執行緒分別執行不同物件中的同步方法(同步**塊)仍然會互斥。
總結:說明synchronized修飾靜態方法(**塊)時,鎖的是這個類。既然修飾靜態方法時鎖的是類,多個執行緒執行類中同步方法時會互斥,那麼直接將synchronized加到類上,鎖這個類肯定同修飾靜態方法效果一樣,都互斥。
執行緒synchronized 例子
public class foo public int fix int y return x public class myrunnable implements runnable catch interruptedexception e system.out.println thread.curr...
執行緒同步synchronized
synchronized只是保證在同乙個時刻,其他執行緒不能訪問鎖定的資源,但是其他方法或者是變數不能鎖定控制的 synchronized obj 上面語法格式中synchronized後括號裡的obj就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...
執行緒鎖 synchronized
使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...