From 17f951ccc300320f5fb1d46e00f9f4cce154cc7a Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Thu, 6 Aug 2026 11:22:55 +0800 Subject: [PATCH] =?UTF-8?q?s-day06-synchornized=E4=BB=A3=E7=A0=81=E5=9D=97?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/inmind/thread_safe04/TicketTask.java | 2 -- .../thread_safe_sychronized05/Demo06.java | 28 ++++++++++++++++++ .../thread_safe_sychronized05/TicketTask.java | 29 +++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 s-day06/src/com/inmind/thread_safe_sychronized05/Demo06.java create mode 100644 s-day06/src/com/inmind/thread_safe_sychronized05/TicketTask.java diff --git a/s-day06/src/com/inmind/thread_safe04/TicketTask.java b/s-day06/src/com/inmind/thread_safe04/TicketTask.java index 56aff9b..58ff6e4 100644 --- a/s-day06/src/com/inmind/thread_safe04/TicketTask.java +++ b/s-day06/src/com/inmind/thread_safe04/TicketTask.java @@ -10,14 +10,12 @@ public class TicketTask implements Runnable{ while (true) { //如果有票就卖 if (ticketCount > 0) { - //模拟卖票时间 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } - System.out.println(Thread.currentThread().getName() + "正在卖第" + ticketCount + "张票"); ticketCount--; } else { diff --git a/s-day06/src/com/inmind/thread_safe_sychronized05/Demo06.java b/s-day06/src/com/inmind/thread_safe_sychronized05/Demo06.java new file mode 100644 index 0000000..b53ead8 --- /dev/null +++ b/s-day06/src/com/inmind/thread_safe_sychronized05/Demo06.java @@ -0,0 +1,28 @@ +package com.inmind.thread_safe_sychronized05; + +/* +在java中可以使用一个关键字synchronized来解决线程安全问题. + + synchronized能够修饰代码块和方法,修饰代码块之后就被称之为同步代码块,修饰方法之后就被称之为同步方法 + + 同步代码块语法: + synchronized(锁对象){ + 具有线程安全问题的代码 + } + + 同步代码块的作用:只有拥有锁对象的线程才能进入同步代码块去执行,如果没有锁对象的线程 + 就会被阻塞在synchronized关键字处. + + 锁对象:可以是java中的任意一个对象.Object String ArrayList. + + 注意:在同步代码块中,锁对象不管有多少个线程,它只能是同一个 + */ +public class Demo06 { + public static void main(String[] args) { + //创建卖票任务 + TicketTask ticketTask = new TicketTask(); + new Thread(ticketTask, "窗口1").start(); + new Thread(ticketTask,"窗口2").start(); + new Thread(ticketTask,"窗口3").start(); + } +} diff --git a/s-day06/src/com/inmind/thread_safe_sychronized05/TicketTask.java b/s-day06/src/com/inmind/thread_safe_sychronized05/TicketTask.java new file mode 100644 index 0000000..f2527d6 --- /dev/null +++ b/s-day06/src/com/inmind/thread_safe_sychronized05/TicketTask.java @@ -0,0 +1,29 @@ +package com.inmind.thread_safe_sychronized05; + +//卖票任务:就是卖100张票 +public class TicketTask implements Runnable{ + int ticketCount = 100;//100张票 + Object lock = new Object();//锁对象 + + @Override + public void run() { + //有票就卖 + while (true) { + synchronized (lock){//这里是3个线程共享的同一个锁对象 + //如果有票就卖 + if (ticketCount > 0) { + //模拟卖票时间 + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread().getName() + "正在卖第" + ticketCount + "张票"); + ticketCount--; + } else { + break;//结束循环 + } + } + } + } +}