直接贴代码:
package com.luke.Thread;
public class SychronizedDemo001 {
public static void main(String[] args) throws InterruptedException {
resource r = new resource();
Thread t1 = new Thread(r, "1号");
Thread t2 = new Thread(r, "2号");
t1.start();
Thread.sleep(40);
r.flage= false;
t2.start();
}
}
class resource implements Runnable{
private static int trickes = 100;
public boolean flage = true;
Object oj = new Object();
@Override
public void run() {
if(flage){//如果是true就执行同步代码快,否则执行的就是 非静态同步方法
while(trickes>0){
synchronized(this){//这里锁住 本类的字节码文件,如果没有发生线程安全问题,就说明静态同步方法锁的也是.class
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(trickes>0){
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trickes+1)+"票");
trickes--;
}
}
}
}else{
while(trickes>0){
try {
sales();//这里执行的是this锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//非静态同步方法
private static synchronized void sales() throws InterruptedException{
Thread.sleep(40);
if(trickes>0){
System.out.println(Thread.currentThread().getName()+",出售第"+(100-trickes+1)+"票");
trickes--;
}
}
}
如上面的代码,
这本来是想证明 静态同步方法锁的是什么对象。同步代码块里面锁的是this对象,理想的结果应该是出现线程问题,
但是,经过多次试验,我发现。只有当3个地方的sleep()方法的睡眠时间一样,或者 这3个睡眠时间全部都不一样的时候才会发生线程问题。如果,main方法里面的sleep()方法的睡眠时间与同步代码块和静态同步方法的时间不一样。(同步代码块和静态同步方法的睡眠时间一样)。这个时候,运行了很多次,就是不会出现线程安全问题。请问这个sleep()方法的睡眠时间为什么会导致这样的问题?
执行顺序导致的啊