同步方法和同步块
同步代码块
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--+"张票");
        }
    }
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号