代码是三个窗口售票
这段代码线程是安全的,它和第二个不安全有什么区别么,之不不过是判定条件改变,两段代码同步监视器(锁)在程序运行中都是唯一的。
第一段代码:
public class ThreadWindons implements Runnable{
private int count = 100;
Object obj = new Object();
public void run(){
while(true){//这里为true,此时线程安全
synchronized (obj) {//同步锁,给共享资源上锁
if(count > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售出" + count + "号票");
count--;
}
else{
break;
}
}
}
}
}
class ThreadTest{
public static void main(String[] args){
ThreadWindons t1 = new ThreadWindons();
Thread w1 = new Thread(t1);
Thread w2 = new Thread(t1);
Thread w3 = new Thread(t1);
w1.setName("1号窗口");
w2.setName("2号窗口");
w3.setName("3号窗口");
w1.start();
w2.start();
w3.start();
}
}
结果:
无错票
第二段代码:
public class ThreadWindons implements Runnable{
private int count = 100;
Object obj = new Object();
public void run(){
while(count > 0){
synchronized (obj) {//同步锁,给共享资源上锁
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售出" + count + "号票");
count--;
}
}
}
}
class ThreadTest{
public static void main(String[] args){
ThreadWindons t1 = new ThreadWindons();
Thread w1 = new Thread(t1);
Thread w2 = new Thread(t1);
Thread w3 = new Thread(t1);
w1.setName("1号窗口");
w2.setName("2号窗口");
w3.setName("3号窗口");
w1.start();
w2.start();
w3.start();
}
}
结果:
出现错票