diff --git a/javaSE-day06/src/com/inmind/syncnized05/Demo05.java b/javaSE-day06/src/com/inmind/syncnized05/Demo05.java new file mode 100644 index 0000000..cc6fca0 --- /dev/null +++ b/javaSE-day06/src/com/inmind/syncnized05/Demo05.java @@ -0,0 +1,29 @@ +package com.inmind.syncnized05; + +/* +在java中可以使用一个关键字synchronized来解决线程安全问题. + + synchronized能够修饰代码块和方法,修饰代码块之后就被称之为同步代码块,修饰方法之后就被称之为同步方法 + + 同步代码块语法: + synchronized(锁对象){ + 具有线程安全问题的代码 + } + + 同步代码块的作用:只有拥有锁对象的线程才能进入同步代码块去执行,如果没有锁对象的线程就会被阻塞在synchronized关键字处. + + 锁对象:可以是java中的任意一个对象.Object String ArrayList. + + 注意:在同步代码块中,锁对象不管有多少个线程,它只能是同一个 + */ +public class Demo05 { + 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/syncnized05/TicketTask.java b/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java new file mode 100644 index 0000000..eb11f5e --- /dev/null +++ b/javaSE-day06/src/com/inmind/syncnized05/TicketTask.java @@ -0,0 +1,28 @@ +package com.inmind.syncnized05; + +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; + } + } + } + } +} diff --git a/javaSE-day06/src/com/inmind/thread_safe04/Demo04.java b/javaSE-day06/src/com/inmind/thread_safe04/Demo04.java index 1b170df..2c4d034 100644 --- a/javaSE-day06/src/com/inmind/thread_safe04/Demo04.java +++ b/javaSE-day06/src/com/inmind/thread_safe04/Demo04.java @@ -11,6 +11,8 @@ package com.inmind.thread_safe04; 分析: 一个卖100张票的任务:Runnable接口表示 3个窗口来卖:3个线程 + +总结:当多个线程在操作同一个数据的时候,就有可能产生线程安全问题,由于CPU调用线程的随机性导致 */ public class Demo04 { public static void main(String[] args) {