Android-Java-同步方法-synchronized


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();
    }

}

 

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM