同步方法和同步块

同步代码块

synchronized(任意类型的对象,相当于一把锁){代码块}:

当线程抢到了CPU资源,CPU会执行完当前线程的代码,CPU再进入下一次被争夺中(防止了当前线程代码块还未执行完,就进入下一个线程,导致数据紊乱)

        synchronized (account){    //同步锁,锁的对象应该是会变化的量
            //余额不足,取不了钱
            if(account.num-getMoney<=0){
                System.out.println("你好"+this.getName()+"余额不足");
                return;
            }
            account.num = account.num-getMoney;
            nowMoney = nowMoney+getMoney;
            System.out.println(this.getName()+"手上有"+nowMoney);
            System.out.println(account.name+"余额为"+account.num);

        }

同步方法

用synchronized去修饰方法,就成了同步方法。也就是将第一种方法的代码块用方法封装起来了

修饰普通方法的锁时,他的锁是:this(也就是创建的对象)
修饰静态方法时,他的锁是:类名.class

package com.Luoking.Thread;

public class Runnable01{

    public static void main(String[] args) {

        BuyTick runnable01 = new BuyTick();
        new Thread(runnable01, "小名").start();
        new Thread(runnable01, "小杰").start();
        new Thread(runnable01, "小平").start();
        new Thread(() -> System.out.println("lamda表达式")).start();
    }
}

class BuyTick implements Runnable{
    private int tickets = 100;
    @Override
    public void run() {
        buy();
    }
    public synchronized void buy(){
        while(true){
            if (tickets<=0){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"拿到第"+tickets--+"张票");

        }
    }
}

posted @ 2022-04-30 12:12  小罗要有出息  阅读(53)  评论(0编辑  收藏  举报