synchronized同步鎖機制
定義鎖🔒的方式一:
package android.java.thread09; public class Test implements Runnable { /** * 定義一個鎖🔒,此鎖🔒是共享的,這個鎖是Java內部要去判斷用的,屬於隱士的 看不到的 * Java內部的實現屬於 🔒鎖機制 */ Object lock = new Object(); @Override public void run() { synchronized (lock) { /** * 多線程操作共享數據 * 重復執行引發的問題 * ........... */ } } }
定義鎖🔒的方式二:
package android.java.thread09; public class Test2 implements Runnable { @Override public void run() { /** Test2.class 認為是一個鎖🔒,Test2.class是共享的鎖🔒,這個鎖是Java內部要去判斷用的,屬於隱士的 看不到的 * Java內部的實現屬於 🔒鎖機制 */ synchronized (Test2.class) { /** * 多線程操作共享數據 * 重復執行引發的問題 * ........... */ } } }
定義鎖🔒的方式 ...... 還有很多方式
舉例:高鐵上的廁所:
1.廁所門顯示無人,高鐵上有五個人,這五個人誰先進去(代表誰被CPU執行了)
synchronized (廁所門顯示無人 🔓) { // 上廁所任務 ........ }
2.廁所門顯示有人,高鐵上有五個人,進去了一個人,進去的這個人一旦進去就會把門🔒上,其他四個人在門外等着,進不去
synchronized (廁所門顯示有人 🔒) { // 上廁所任務 ........ }
3.進去的哪個人,上完廁所了,鎖就打開了,廁所門上顯示無人, 其他四個人誰先進去(主要看CPU執行權在哪個線程上執行)
synchronized (廁所門顯示無人 🔓) { // 上廁所任務 ........ } 上完廁所了,鎖就打開🔓,廁所門上顯示無人
synchronized同步代碼塊利與弊
1.好處是:synchronized同步代碼,解決安全問題。
2.壞處是:每次都需要判斷synchronized(的🔒是否 鎖住),有點耗性能;
總結:1.完全問題解決, 2.有點耗性能, 當然選擇1.完全問題解決