多线程模拟卖票

模拟情形

一个线程代表一个窗口,总共100张票,三个线程同时卖票并显示该线程剩余票数

实现

使用synchronized同步锁:一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。

进程同步:同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
各个进程会抢占cpu的使用权,出现bug,这个时候需要使用锁来实现对一个线程的使用权的保护。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package 多线程.卖票;

public class SellTicket implements Runnable {
private int tickets=100;
@Override
public void run() {
// TODO Auto-generated method stub

while(true) {
synchronized (obj) {
if(tickets>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在售票还有"+tickets+"张");
tickets--;
}
}
}

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package 多线程.卖票;

public class SellTicketDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
SellTicket st=new SellTicket();

Thread t1=new Thread(st,"窗口1");
Thread t2=new Thread(st,"窗口2");
Thread t3=new Thread(st,"窗口3");
t1.setPriority(10);
t1.start();
t2.start();
t3.start();
System.out.println("t1的优先级"+t1.getPriority());
System.out.println("t2的优先级"+t2.getPriority());
System.out.println("t3的优先级"+t3.getPriority());
}

}

还存在的问题

1.如果没有设置进程休眠时间,出现同时争抢1张票,并且没有顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
t1的优先级5
t2的优先级5
t3的优先级5
窗口2正在售票还有100张
窗口1正在售票还有100张
窗口3正在售票还有100张
窗口1正在售票还有98张
窗口2正在售票还有99张
窗口2正在售票还有95张
窗口1正在售票还有96张
窗口3正在售票还有97张
窗口1正在售票还有93张
窗口2正在售票还有94张
窗口1正在售票还有91张
窗口3正在售票还有92张
窗口1正在售票还有89张
窗口2正在售票还有90张
窗口1正在售票还有87张
窗口3正在售票还有88张
窗口1正在售票还有85张
窗口2正在售票还有86张
窗口1正在售票还有83张
窗口3正在售票还有84张
窗口1正在售票还有81张
窗口2正在售票还有82张
窗口1正在售票还有79张
窗口3正在售票还有80张
窗口1正在售票还有77张
窗口2正在售票还有78张
窗口1正在售票还有75张
窗口3正在售票还有76张
窗口1正在售票还有73张
窗口2正在售票还有74张
窗口1正在售票还有71张
窗口3正在售票还有72张
窗口1正在售票还有69张
窗口2正在售票还有70张
窗口1正在售票还有67张
窗口3正在售票还有68张
窗口1正在售票还有65张
窗口2正在售票还有66张
窗口1正在售票还有63张
窗口3正在售票还有64张
窗口1正在售票还有61张
窗口2正在售票还有62张
窗口1正在售票还有59张
窗口3正在售票还有60张
窗口1正在售票还有57张
窗口2正在售票还有58张
窗口1正在售票还有55张
窗口3正在售票还有56张
窗口1正在售票还有53张
窗口2正在售票还有54张
窗口1正在售票还有51张
窗口3正在售票还有52张
窗口1正在售票还有49张
窗口2正在售票还有50张
窗口1正在售票还有47张
窗口3正在售票还有48张
窗口1正在售票还有45张
窗口2正在售票还有46张
窗口1正在售票还有43张
窗口3正在售票还有44张
窗口1正在售票还有41张
窗口2正在售票还有42张
窗口2正在售票还有38张
窗口1正在售票还有39张
窗口3正在售票还有40张
窗口1正在售票还有36张
窗口2正在售票还有37张
窗口2正在售票还有33张
窗口1正在售票还有34张
窗口3正在售票还有35张
窗口3正在售票还有30张
窗口1正在售票还有31张
窗口2正在售票还有32张
窗口1正在售票还有28张
窗口3正在售票还有29张
窗口1正在售票还有26张
窗口2正在售票还有27张
窗口1正在售票还有24张
窗口3正在售票还有25张
窗口1正在售票还有22张
窗口2正在售票还有23张
窗口1正在售票还有20张
窗口3正在售票还有21张
窗口1正在售票还有18张
窗口2正在售票还有19张
窗口1正在售票还有16张
窗口3正在售票还有17张
窗口1正在售票还有14张
窗口2正在售票还有15张
窗口1正在售票还有12张
窗口1正在售票还有10张
窗口1正在售票还有9张
窗口3正在售票还有13张
窗口1正在售票还有8张
窗口2正在售票还有11张
窗口1正在售票还有6张
窗口3正在售票还有7张
窗口1正在售票还有4张
窗口2正在售票还有5张
窗口1正在售票还有2张
窗口3正在售票还有3张
窗口2正在售票还有1张

2.如果设置了休眠时间,有序但是会出现-1现象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
t1的优先级5
t2的优先级5
t3的优先级5
窗口3正在售票还有100张
窗口2正在售票还有99张
窗口1正在售票还有98张
窗口2正在售票还有97张
窗口3正在售票还有96张
窗口1正在售票还有95张
窗口2正在售票还有94张
窗口1正在售票还有93张
窗口3正在售票还有92张
窗口1正在售票还有91张
窗口2正在售票还有91张
窗口3正在售票还有91张
窗口1正在售票还有88张
窗口3正在售票还有87张
窗口2正在售票还有86张
窗口1正在售票还有85张
窗口3正在售票还有84张
窗口2正在售票还有83张
窗口1正在售票还有82张
窗口3正在售票还有81张
窗口2正在售票还有80张
窗口2正在售票还有79张
窗口3正在售票还有78张
窗口1正在售票还有77张
窗口1正在售票还有76张
窗口3正在售票还有75张
窗口2正在售票还有74张
窗口2正在售票还有73张
窗口3正在售票还有72张
窗口1正在售票还有71张
窗口1正在售票还有70张
窗口3正在售票还有69张
窗口2正在售票还有68张
窗口2正在售票还有67张
窗口3正在售票还有66张
窗口1正在售票还有65张
窗口1正在售票还有64张
窗口3正在售票还有63张
窗口2正在售票还有62张
窗口1正在售票还有61张
窗口3正在售票还有60张
窗口2正在售票还有59张
窗口1正在售票还有58张
窗口3正在售票还有57张
窗口2正在售票还有56张
窗口1正在售票还有55张
窗口3正在售票还有54张
窗口2正在售票还有53张
窗口2正在售票还有52张
窗口3正在售票还有51张
窗口1正在售票还有50张
窗口1正在售票还有49张
窗口3正在售票还有48张
窗口2正在售票还有47张
窗口2正在售票还有46张
窗口3正在售票还有45张
窗口1正在售票还有44张
窗口1正在售票还有43张
窗口3正在售票还有42张
窗口2正在售票还有41张
窗口2正在售票还有40张
窗口3正在售票还有39张
窗口1正在售票还有39张
窗口2正在售票还有37张
窗口1正在售票还有36张
窗口3正在售票还有35张
窗口3正在售票还有34张
窗口1正在售票还有33张
窗口2正在售票还有32张
窗口2正在售票还有31张
窗口1正在售票还有30张
窗口3正在售票还有29张
窗口2正在售票还有28张
窗口1正在售票还有27张
窗口3正在售票还有26张
窗口2正在售票还有25张
窗口1正在售票还有24张
窗口3正在售票还有23张
窗口3正在售票还有22张
窗口1正在售票还有21张
窗口2正在售票还有20张
窗口3正在售票还有19张
窗口1正在售票还有18张
窗口2正在售票还有17张
窗口1正在售票还有16张
窗口3正在售票还有15张
窗口2正在售票还有14张
窗口1正在售票还有13张
窗口3正在售票还有12张
窗口2正在售票还有11张
窗口2正在售票还有10张
窗口3正在售票还有9张
窗口1正在售票还有8张
窗口2正在售票还有7张
窗口3正在售票还有6张
窗口1正在售票还有5张
窗口2正在售票还有4张
窗口1正在售票还有3张
窗口3正在售票还有2张
窗口2正在售票还有1张
窗口3正在售票还有0张
窗口1正在售票还有-1张

3.synchronized使用范围:使用修饰一个代码块,写在循环外时则该循环只能由第一个线程一直执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
t1的优先级5
t2的优先级10
t3的优先级5
窗口2正在售票还有100张
窗口2正在售票还有99张
窗口2正在售票还有98张
窗口2正在售票还有97张
窗口2正在售票还有96张
窗口2正在售票还有95张
窗口2正在售票还有94张
窗口2正在售票还有93张
窗口2正在售票还有92张
窗口2正在售票还有91张
窗口2正在售票还有90张
窗口2正在售票还有89张
窗口2正在售票还有88张
窗口2正在售票还有87张
窗口2正在售票还有86张
窗口2正在售票还有85张
窗口2正在售票还有84张
窗口2正在售票还有83张
窗口2正在售票还有82张
窗口2正在售票还有81张
窗口2正在售票还有80张
窗口2正在售票还有79张
窗口2正在售票还有78张
窗口2正在售票还有77张
窗口2正在售票还有76张
窗口2正在售票还有75张
窗口2正在售票还有74张
窗口2正在售票还有73张
窗口2正在售票还有72张
窗口2正在售票还有71张
窗口2正在售票还有70张
窗口2正在售票还有69张
窗口2正在售票还有68张
窗口2正在售票还有67张
窗口2正在售票还有66张
窗口2正在售票还有65张
窗口2正在售票还有64张
窗口2正在售票还有63张
窗口2正在售票还有62张
窗口2正在售票还有61张
窗口2正在售票还有60张
窗口2正在售票还有59张
窗口2正在售票还有58张
窗口2正在售票还有57张
窗口2正在售票还有56张
窗口2正在售票还有55张
窗口2正在售票还有54张
窗口2正在售票还有53张
窗口2正在售票还有52张
窗口2正在售票还有51张
窗口2正在售票还有50张
窗口2正在售票还有49张
窗口2正在售票还有48张
窗口2正在售票还有47张
窗口2正在售票还有46张
窗口2正在售票还有45张
窗口2正在售票还有44张
窗口2正在售票还有43张
窗口2正在售票还有42张
窗口2正在售票还有41张
窗口2正在售票还有40张
窗口2正在售票还有39张
窗口2正在售票还有38张
窗口2正在售票还有37张
窗口2正在售票还有36张
窗口2正在售票还有35张
窗口2正在售票还有34张
窗口2正在售票还有33张
窗口2正在售票还有32张
窗口2正在售票还有31张
窗口2正在售票还有30张
窗口2正在售票还有29张
窗口2正在售票还有28张
窗口2正在售票还有27张
窗口2正在售票还有26张
窗口2正在售票还有25张
窗口2正在售票还有24张
窗口2正在售票还有23张
窗口2正在售票还有22张
窗口2正在售票还有21张
窗口2正在售票还有20张
窗口2正在售票还有19张
窗口2正在售票还有18张
窗口2正在售票还有17张
窗口2正在售票还有16张
窗口2正在售票还有15张
窗口2正在售票还有14张
窗口2正在售票还有13张
窗口2正在售票还有12张
窗口2正在售票还有11张
窗口2正在售票还有10张
窗口2正在售票还有9张
窗口2正在售票还有8张
窗口2正在售票还有7张
窗口2正在售票还有6张
窗口2正在售票还有5张
窗口2正在售票还有4张
窗口2正在售票还有3张
窗口2正在售票还有2张
窗口2正在售票还有1张