同步方法和同步块
同步代码块
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--+"张票");
}
}
}