为了账号安全,请及时绑定邮箱和手机立即绑定

有没有碰到过这种情况,这是什么意思

/ 猿问

有没有碰到过这种情况,这是什么意思

迷失代码林 2018-11-11 21:55:43

创建3个线程run一个method方法,第一个线程启动间隔10ms启动第二个线程再隔200ms启动第三个线程。

并没有对线程2作出超过线程3的限制,但是每次都是线程3先执行,这是什么意思?后面试了下2000ms执行的顺序才和代码顺序一样。下面附上代码,请各位看官指教!

public class ChangeLock {	private String lock = "lock";		private void method(){		synchronized (lock) {			try {				System.out.println("当前线程 : "  + Thread.currentThread().getName() + "开始");				if(Thread.currentThread().getName().equals("t1"))lock = "1";				Thread.sleep(2000);				System.out.println("当前线程 : "  + Thread.currentThread().getName() + "结束"+lock+"内存地址:"+System.identityHashCode(lock));			} catch (InterruptedException e) {				e.printStackTrace();			}		}	}		public static void main(String[] args) throws InterruptedException {		final ChangeLock changeLock = new ChangeLock();		Thread t1 = new Thread(()->changeLock.method(),"t1");		Thread t2 = new Thread(()->(new ChangeLock()).method(),"t2");		t1.start();		Thread.sleep(10);		t2.start();		Thread.sleep(200);		Thread t3=new Thread((new ChangeLock())::method,"t3");		t3.start();			}	}

执行结果:

当前线程 : t1开始

当前线程 : t1结束1内存地址:1901608479

当前线程 : t3开始

当前线程 : t3结束lock内存地址:460860509

当前线程 : t2开始

当前线程 : t2结束lock内存地址:460860509


没做更多的测试,想想200ms的时间够cpu来说已经很长了,为什么t3总能在t2线程之前执行???

查看完整描述

目前暂无任何回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信