From 9c67741e28e8789d9f6914ae155108221b369876 Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Sat, 7 Mar 2026 16:02:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E9=98=B6day06-synchornized=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=96=B9=E6=B3=95=E8=A7=A3=E5=86=B3=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/inmind/syncnized05/TicketTask.java | 36 ++++++++++++------- .../com/inmind/syncnized_method06/Demo06.java | 25 +++++++++++++ .../inmind/syncnized_method06/TicketTask.java | 29 +++++++++++++++ 3 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 javaSE-day06/src/com/inmind/syncnized_method06/Demo06.java create mode 100644 javaSE-day06/src/com/inmind/syncnized_method06/TicketTask.java diff --git a/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java b/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java index eb11f5e..4fe67ec 100644 --- a/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java +++ b/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java @@ -10,19 +10,31 @@ public class TicketTask implements Runnable{ //有票就卖 while (true) { //使用同步代码块解决线程安全问题 - synchronized (lock){ - if (tickeCount > 0) { - try { - Thread.sleep(50); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println(Thread.currentThread().getName() + "正在卖第" + tickeCount + "张电影票"); - tickeCount--; - } else { - break; - } + //注意:一定是抢到锁对象的线程才能进入到同步代码块,执行代码,其他没有抢到的线程会被阻塞在此 +// synchronized (lock){ + sellTicket(); +// } + } + } + + /* + 卖票方法 + 同步方法中有没有锁对象??? + 同步成员方法的锁对象:this + 同步静态方法的锁对象:Class对象(反射) + + 复习:静态方法只能访问静态内容(静态变量和静态方法),静态只跟类有关,跟对象无关 + */ + //抽取出一个卖票方法 + public synchronized void sellTicket(){ + if (tickeCount > 0) { + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); } + System.out.println(Thread.currentThread().getName() + "正在卖第" + tickeCount + "张电影票"); + tickeCount--; } } } diff --git a/javaSE-day06/src/com/inmind/syncnized_method06/Demo06.java b/javaSE-day06/src/com/inmind/syncnized_method06/Demo06.java new file mode 100644 index 0000000..51d9c0c --- /dev/null +++ b/javaSE-day06/src/com/inmind/syncnized_method06/Demo06.java @@ -0,0 +1,25 @@ +package com.inmind.syncnized_method06; + +/* +synchronized能够修饰代码块和方法,修饰代码块之后就被称之为同步代码块,修饰方法之后就被称之为同步方法 + + 同步方法语法: + 修饰符 synchronized 返回值类型 方法名(参数列表){ + 方法体 + } + + 同步方法:就是在整个方法体的所有代码上都加上同步代码块 + + 同步方法也是有锁对象的,只不过这个锁对象不需要我们程序员创建 + */ +public class Demo06 { + public static void main(String[] args) { + //创建3个窗口来执行同一个任务 + TicketTask ticketTask = new TicketTask(); + + new Thread(ticketTask,"窗口1").start(); + new Thread(ticketTask,"窗口2").start(); + new Thread(ticketTask,"窗口3").start(); + + } +} diff --git a/javaSE-day06/src/com/inmind/syncnized_method06/TicketTask.java b/javaSE-day06/src/com/inmind/syncnized_method06/TicketTask.java new file mode 100644 index 0000000..179c17b --- /dev/null +++ b/javaSE-day06/src/com/inmind/syncnized_method06/TicketTask.java @@ -0,0 +1,29 @@ +package com.inmind.syncnized_method06; + +public class TicketTask implements Runnable{ + //定义100张票电影票 + int tickeCount = 100; + Object lock = new Object();//创建一个锁对象 + + @Override + public void run() { + //有票就卖 + while (true) { + //使用同步代码块解决线程安全问题 + //注意:一定是抢到锁对象的线程才能进入到同步代码块,执行代码,其他没有抢到的线程会被阻塞在此 + synchronized (lock){ + if (tickeCount > 0) { + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread().getName() + "正在卖第" + tickeCount + "张电影票"); + tickeCount--; + } else { + break; + } + } + } + } +}