同步方法和同步块
同步代码块
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--+"张票"); } } }
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决