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; + } + } + } + } +}