同步思想概述

加锁,把共享资源进行上锁,每次只能一个线程进入访问完毕以后解锁,然后其他线程才能进来。

方式一:同步代码块

**作用:**把出现线程安全问题的核心代码给上锁。

**原理:**每次只能一个线程进入,执行完毕后自动解锁,其他县城才可以进来执行。

格式:

Untitled

**锁对象要求:**理论上,锁对象只要对于当前同时执行的线程来说是同一个对象即可。

package com.itheima.d4_thread_synchronized_code;

/**
    账户类:余额,卡号
 */
public class Account {
    private String cardId;
    private double money; // 余额 关键信息

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

//    // 100个线程人
//    public static void run(){
//        synchronized (Account.class){
//
//        }
//    }

    /**
      小明 小红
     */
    public void drawMoney(double money) {
        // 1、拿到是谁来取钱
        String name = Thread.currentThread().getName();
        // 同步代码块
        // 小明 小红
        // this == acc 共享账户
        synchronized (this) {
            // 2、判断余额是否足够
            if(this.money >= money){
                // 钱够了
                System.out.println(name+"来取钱,吐出:" + money);
                // 更新余额
                this.money -= money;
                System.out.println(name+"取钱后,余额剩余:" + this.money);
            }else{
                // 3、余额不足
                System.out.println(name+"来取钱,余额不足!");
            }
        }
    }
}

<aside> 💡 锁对象要是唯一的吗?

实例对象锁

  1. 实例对象锁(synchronized(this)):
  2. 类对象锁(synchronized(MyClass.class)):

在实际应用中,你应该根据需要保护的资源的类型和范围来选择合适的锁对象。如果只需要保护单个对象的状态,使用实例对象锁(synchronized(this))通常是更好的选择。如果需要保护整个类的资源,或者确保某个操作在整个类中是唯一的,那么类对象锁(synchronized(MyClass.class))可能更合适。

方式二:同步方法

**作用:**把出现线程安全问题的核心方法给上锁。 **原理:**每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行。

Untitled

同步方法底层原理