public class SynBlockTest {
public static void main(String[] args) {
Web12306 web = new Web12306();
new Thread(web,"用户").start();
new Thread(web,"黄牛").start();
new Thread(web,"搞事的").start();
}
}
class Web12306 implements Runnable{
//票数
private int ticketNum = 10;
private boolean flag = true;
@Override
public void run() {
while(flag){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
//test01();
// test02();
// test03();
test04();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//有问题
public void test01() throws InterruptedException {
if(ticketNum <= 0){ //票没有了,但是没有效果
flag = false;
return;
}
//模拟延时
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "--->" + ticketNum--);
}
//有效果,但是性能不高
public synchronized void test02() throws InterruptedException {
if(ticketNum <= 0){
flag = false;
return;
}
//模拟延时
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "--->" + ticketNum--);
}
//可能会出问题,直接锁错了ticketNum
public void test03() throws InterruptedException {
synchronized((Integer)ticketNum){
if(ticketNum <= 0){
flag = false;
return;
}
//模拟延时
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "--->" + ticketNum--);
}
}
//代码块
//锁住当前的对象
public void test04() throws InterruptedException {
synchronized(this){
if(ticketNum <= 0){
flag = false;
return;
}
//模拟延时
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "--->" + ticketNum--);
}
}
}
test01的运行结果
搞事的--->8
黄牛--->9
用户--->10
搞事的--->7
用户--->6
黄牛--->5
搞事的--->4
用户--->3
黄牛--->2
搞事的--->1
用户--->0
黄牛--->-1
test02的运行结果
用户--->10
黄牛--->9
搞事的--->8
黄牛--->7
用户--->6
黄牛--->5
搞事的--->4
黄牛--->3
用户--->2
黄牛--->1
test03的运行结果
搞事的--->10
用户--->9
黄牛--->8
搞事的--->7
用户--->6
黄牛--->5
搞事的--->4
用户--->3
黄牛--->2
搞事的--->1
用户--->0
test04的运行结果
用户--->10
黄牛--->9
搞事的--->8
黄牛--->7
用户--->6
黄牛--->5
搞事的--->4
黄牛--->3
用户--->2
黄牛--->1