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(); } }
执行结果: