首页 新闻 会员 周边

并发基础,sleep()方法 关于睡眠时间不一样,而导致结果不同有疑问,请大神帮忙分析分析。

0
[已解决问题] 解决于 2020-11-09 15:06

直接贴代码:

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()方法的睡眠时间为什么会导致这样的问题?

lukely的主页 lukely | 初学一级 | 园豆:147
提问于:2020-02-03 21:41
< >
分享
最佳答案
0

执行顺序导致的啊
头像

奖励园豆:5
btbear3 | 菜鸟二级 |园豆:247 | 2020-02-04 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册