`
xuweijian2009
  • 浏览: 22865 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

synchronized的一到笔试题目

阅读更多
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;
	}
}


请写出运行结果:
分享到:
评论
4 楼 tobeno1 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的打印之后吗?
3 楼 liamning 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``
2 楼 cjie888 2009-03-04  
b=500
1 楼 hazerscript 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;
}
}

相关推荐

Global site tag (gtag.js) - Google Analytics