同步代码块中的锁可以是this关键字
创建线程类:
package com.thread.Safety;
public class TrainTicket implements Runnable {
private int ticket = 100;
private Object object = new Object();
@Override
public void run() {
while (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object) {
// 这里一定要加上if判断
if (ticket>0){
System.out.println(Thread.currentThread().getName() + "--->" + (100 - ticket + 1));
ticket--;
}
}
}
}
}
测试类:
package com.thread.Safety;
public class TarinTicketDemo {
public static void main(String[] args) {
TrainTicket trainTicket = new TrainTicket();
new Thread(trainTicket,"线程一").start();
new Thread(trainTicket,"线程二").start();
}
}
执行结果:
线程二--->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