1.方法具有封裝性;
/** * 1.方法具有封裝性; */ public void addMoney(double moneyAsset) { this.moneyAsset += moneyAsset; System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元"); }
2.synchronized同步代碼塊具有同步代碼鎖機制
/** * 1.方法具有封裝性; */ public void addMoney(double moneyAsset) { /** * 2.synchronized同步代碼塊具有同步代碼鎖機制 * 多線程執行共享數據/變化共享數據的代碼,然后用synchronized{} */ synchronized (Bank.class) { // 只持有一把鎖Bank.class this.moneyAsset += moneyAsset; System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元"); } }
3.可以讓方法具有封裝性 並 具有同步代碼鎖機制
偽代碼:synchronized(this)
public synchronized(this) void addMoney(double moneyAsset) {
}
開發代碼:
/** * 3.可以讓方法具有封裝性 並 具有同步代碼鎖機制public synchronized void addMoney * synchronized修飾的方法,同步鎖機制的鎖🔒是this * 多線程執行共享數據/變化共享數據的代碼,然后用synchronized */ public synchronized void addMoney(double moneyAsset) { // synchronized (Bank.class) { // 只持有一把鎖Bank.class this.moneyAsset += moneyAsset; System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元"); // } }
可以讓方法具有封裝性 並 具有同步代碼鎖機制(案例代碼)
synchronized修飾的方法,同步鎖機制的鎖🔒是this
synchronized修飾的方法,同步鎖機制的鎖🔒是this 也就是customer
package android.java.thread11; /** * 兩個儲戶,到同一個銀行存錢,每個人存了3次,一次1000000.00元 * 1.描述銀行 * 2.描述儲戶任務 * 3.分析這個多線程是否存在安全隱患 */ /** * 1.描述銀行 */ class Bank { // 3.分析這個多線程是否存在安全隱患 這里就是多線程執行的共享對象的共享數據 private double moneyAsset; /** * 3.可以讓方法具有封裝性 並 具有同步代碼鎖機制public synchronized void addMoney * synchronized修飾的方法,同步鎖機制的鎖🔒是this * 多線程執行共享數據/變化共享數據的代碼,然后用synchronized */ public synchronized void addMoney(double moneyAsset) { // synchronized (Bank.class) { // 只持有一把鎖Bank.class this.moneyAsset += moneyAsset; System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元"); // } } } /** * 2.描述儲戶任務 */ class Customer implements Runnable { // 3.分析這個多線程是否存在安全隱患 這里就是多線程執行的共享對象 private Bank bank = new Bank(); @Override public void run() { for (int i = 0; i < 3; i++) { bank.addMoney(1000000.00); } } } public class BankTest { public static void main(String[] args) { /** * 定義執行的任務 synchronized修飾的方法,同步鎖機制的鎖🔒是this 也就是customer */ Runnable customer = new Customer(); // 線程執行>>>定義執行的任務 new Thread(customer).start(); new Thread(customer).start(); } }
執行結果: