论坛首页 入门技术论坛

synchronized的一到笔试题目

浏览 2249 次
精华帖 (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;
	}
}


请写出运行结果:
   发表时间: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;
}
}
0 请登录后投票
   发表时间:2009-03-04  
b=500
0 请登录后投票
   发表时间: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``
1 请登录后投票
   发表时间: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的打印之后吗?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics