这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼。

代码:




1 package com.day13.math;
2 /**
3 * 类说明 :模拟三个窗口同时售票
4 * @author 作者 : chenyanlong
5 * @version 创建时间:2017年10月29日
6 */
7 public class ThreadTest1 {
8
9 public static void main(String[] args) {
10 //创建三个线程对象
11 SaleTicket saleTicket1=new SaleTicket("窗口1");
12 SaleTicket saleTicket2=new SaleTicket("窗口2");
13 SaleTicket saleTicket3=new SaleTicket("窗口3");
14
15 //开始售票
16 saleTicket1.start();
17 saleTicket2.start();
18 saleTicket3.start();
19 }
20 }
21
22 //售票的窗口
23 class SaleTicket extends Thread{
24
25 int num=50;//票数
26
27 public SaleTicket(String name){
28 super(name);
29 }
30
31
32
33 @Override
34 public void run(){
35 while(true){
36 if(num>0){
37 System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
38 num--;
39 }else{
40 System.out.println("票买完了!");
41 break;
42 }
43 }
44 }
45 }


View Code


运行效果:

多线程(模拟买票)-----java基础知识总结_同步代码块

 出现在的原因:

多线程(模拟买票)-----java基础知识总结_同步代码块_02

多线程(模拟买票)-----java基础知识总结_ide_03

解决办法:修改这行代码就OK了




1 static int num=50;//票数


View Code


再次的运行效果:

多线程(模拟买票)-----java基础知识总结_ide_04

再一次分析下,突然不想写了,哎,写完吧

多线程(模拟买票)-----java基础知识总结_同步代码块_05

解决办法:

多线程(模拟买票)-----java基础知识总结_ide_06

 

多线程(模拟买票)-----java基础知识总结_ide_07

多线程(模拟买票)-----java基础知识总结_ide_08

 

 

 算了,直接复制源码了




1 package com.day13.math;
2 /**
3 * 类说明 :模拟三个窗口同时售票
4 * @author 作者 : chenyanlong
5 * @version 创建时间:2017年10月29日
6 */
7 public class ThreadTest1 {
8
9 public static void main(String[] args) {
10 //创建三个线程对象
11 SaleTicket saleTicket1=new SaleTicket("窗口1");
12 SaleTicket saleTicket2=new SaleTicket("窗口2");
13 SaleTicket saleTicket3=new SaleTicket("窗口3");
14
15 //开始售票
16 saleTicket1.start();
17 saleTicket2.start();
18 saleTicket3.start();
19 }
20 }
21
22 //售票的窗口
23 class SaleTicket extends Thread{
24
25 static int num=50;//票数
26 static Object o=new Object();
27 public SaleTicket(String name){
28 super(name);
29 }
30
31
32 @Override
33 public void run(){
34 while(true){
35 //同步代码块:
36 synchronized (o) {
37 if(num>0){
38 System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
39 num--;
40 }else{
41 System.out.println("票买完了!");
42 break;
43 }
44 }
45 }
46 }
47 }


View Code


 

同步代码块原理:

多线程(模拟买票)-----java基础知识总结_ide_09

运行效果:

 

多线程(模拟买票)-----java基础知识总结_ide_10

再次优化下代码:




1 package com.day13.math;
2 /**
3 * 类说明 :模拟三个窗口同时售票
4 * @author 作者 : chenyanlong
5 * @version 创建时间:2017年10月29日
6 */
7 public class ThreadTest1 {
8
9 public static void main(String[] args) {
10 //创建三个线程对象
11 SaleTicket saleTicket1=new SaleTicket("窗口1");
12 SaleTicket saleTicket2=new SaleTicket("窗口2");
13 SaleTicket saleTicket3=new SaleTicket("窗口3");
14
15 //开始售票
16 saleTicket1.start();
17 saleTicket2.start();
18 saleTicket3.start();
19 }
20 }
21
22 //售票的窗口
23 class SaleTicket extends Thread{
24
25 static int num=50;//票数
26 static Object o=new Object();
27 public SaleTicket(String name){
28 super(name);
29 }
30
31
32 @Override
33 public void run(){
34 while(true){
35 //同步代码块:
36 synchronized (o) {
37 if(num>0){
38 System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
39 num--;
40 try {
41 Thread.sleep(100);//每个线程执行一次,就睡眠100毫秒
42 } catch (InterruptedException e) {
43 // TODO Auto-generated catch block
44 e.printStackTrace();
45 }
46 }else{
47 System.out.println("票买完了!");
48 break;
49 }
50 }
51 }
52 }
53 }


View Code


运行效果:

多线程(模拟买票)-----java基础知识总结_同步代码块_11