java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...
synchronized關鍵字的意義是什么?
什么時候應該是方法synchronized?
這是什么編程和邏輯?
Java中,“synchronized”(同步)是什么意思?什么時候應該用synchronized?
該synchronized關鍵字是所有不同的線程讀取和寫入相同的變量,對象和資源。這在Java中并不是一個簡單的話題,但是這里是Sun的一句話:
synchronized?方法為防止線程干擾和內存一致性錯誤提供了一個簡單的策略:如果一個對象對多個線程可見,則通過同步方法完成對該對象變量的所有讀取或寫入操作。
簡而言之,當你有兩個線程正在讀寫相同的'資源'時,比如說一個名為變量的變量foo,你需要確保這些線程以同步的方式訪問變量。如果沒有synchronized關鍵字,線程1可能看不到更改線程2?foo,或者更糟糕的是,它可能只有一半被更改。這不會是你所期望的。
“synchronized”(同步)的實例
public class SOP {
public static void print(String s) {
System.out.println(s+"\n");
}
}
public class TestThread extends Thread {
String name;
TheDemo theDemo;
public TestThread(String name,TheDemo theDemo) {
this.theDemo = theDemo;
this.name = name;
start();
}
@Override
public void run() {
theDemo.test(name);
}
}
public class TheDemo {
public synchronized void test(String name) {
for(int i=0;i<10;i++) {
SOP.print(name + " :: "+i);
try{
Thread.sleep(500);
} catch (Exception e) {
SOP.print(e.getMessage());
}
}
}
public static void main(String[] args) {
TheDemo theDemo = new TheDemo();
new TestThread("THREAD 1",theDemo);
new TestThread("THREAD 2",theDemo);
new TestThread("THREAD 3",theDemo);
}
}
注意:synchronized只要前一個線程的執行沒有完成,就阻塞下一個線程對方法test()的調用。線程一次可以訪問這個方法。如果沒有synchronized全部線程可以同時訪問這個方法
當一個線程調用對象的同步方法'test'(這里的對象是'TheDemo'類的一個實例)時,它獲得該對象的鎖,任何新線程只要前一個線程不能調用同一對象的任何同步方法已獲得鎖的鎖不會釋放鎖。
當類的任何靜態同步方法被調用時,會發生類似的事情。線程獲取與類關聯的鎖(在這種情況下,任何線程都可以調用該類實例的任何非靜態同步方法,因為該對象級鎖仍然可用)。只要類級鎖不是由當前擁有該鎖的線程釋放的,任何其他線程都將無法調用該類的任何靜態同步方法。
輸出與同步
THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9
輸出沒有同步
THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9
總結
以上是生活随笔為你收集整理的java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Edge怎么设置网页黑名单? 教你Edg
- 下一篇: 致态 SC001 XT SATA SSD
