浏览 2249 次
锁定老帖子 主题:synchronized的一到笔试题目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-04
package com.xwj.Thread; public class TestSynchronized1 { public static void main(String[] args){ Runner2 r2 = new Runner2(); Thread thread = new Thread(r2); thread.start(); r2.method2(); } } class Runner2 implements Runnable{ int b = 0; public void run() { method1(); } public synchronized void method1(){ b = 100; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("b = "+b); } public void method2(){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } b = 500; } } 请写出运行结果: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-04
method1在sleep时,method2修改了b的值。
给method2添加和method1相同的锁,结果就会如你所愿。 public void method2() { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (this) { b = 500; } } |
|
返回顶楼 | |
发表时间:2009-03-04
b=500
|
|
返回顶楼 | |
发表时间:2009-03-04
b=500;
过程是这样的: 从main函数开始,首先主线程创建了一个Runner2的实例r2,接着新的线程thread获得r2的引用,当thread.start()时,线程thread得到激活,r2.run()运行,接着thread调用同步方法r2.method1()( ps:虽然method()是同步方法,但是主线程没有调用,所以不用等待,直接运行 ),这样b被赋值为100,Thread.sleep(5000)使thread睡眠5s,这时主线程运行,调用r2.method2()(method2()非同步方法,不需要等待),b被赋值为500,Thread.sleep(3000)使主线程睡眠3s,再过2s,thread睡眠结束,输出b,这时b的值为500,所以,输出结果b=500. 说得有点罗嗦``也不知道说的有没有错,希望能帮到lz`` |
|
返回顶楼 | |
发表时间:2009-03-05
hazerscript 写道 method1在sleep时,method2修改了b的值。
给method2添加和method1相同的锁,结果就会如你所愿。 public void method2() { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (this) { b = 500; } } 这样的话,锁释放是在什么时候?method1的打印之后吗? |
|
返回顶楼 | |