`
bjmike
  • 浏览: 276392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

监测一个类里面有两个synchronized方法是否可以同步执行

 
阅读更多
今天面试,一个类里面有两个synchronized方法是否可以同步执行?我回答说可以同步执行,因为synchronized是在方法上锁定,又不是在类上锁定,可面试官说我错了,回家后写测试代码如下:
/**
 * Copyright description
 */
package lock;

/**
 * To Add descript here
 * 检测一个对象里面有两个Synchronized方法,是否可以同步执行
 *
 * @author think
 * @since 2012-1-14
 */
public class SychronizedMethod {
	private int testNum=10;
	public synchronized void test1(){
		System.out.println("test1 entry");
		testNum = 11;
		System.out.println("test1 out");
	}
	public synchronized void test2(){
		System.out.println("test2 entry");
		testNum = 12;
		System.out.println("test2 out");
	}
	
	public static void main(String[] args){
		SychronizedMethod sychronizedMethod = new SychronizedMethod();
		WorkHandler handler = new WorkHandler(sychronizedMethod);
		WorkHandler1 handler1 = new WorkHandler1(sychronizedMethod);
		Thread t1 = new Thread(handler);
		Thread t2 = new Thread(handler1);
		t1.start();
		t2.start();
		
	}
}

/**
 * Copyright description
 */
package lock;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * To Add descript here
 *
 * @author think
 * @since 2012-1-14
 */
public class WorkHandler implements Runnable {
	
	private SychronizedMethod syn;
	
	//AtomicInteger id = new  AtomicInteger();

	WorkHandler(SychronizedMethod syn){
		this.syn = syn;
	}

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		System.out.println("test2 entry");
		syn.test2();
		System.out.println("test2 out");
	}

}

/**
 * Copyright description
 */
package lock;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * To Add descript here
 *
 * @author think
 * @since 2012-1-14
 */
public class WorkHandler1 implements Runnable {
	
	private SychronizedMethod syn;
	
	//AtomicInteger id = new  AtomicInteger();

	WorkHandler1(SychronizedMethod syn){
		this.syn = syn;
	}

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		System.out.println("test1 entry");
		syn.test1();
		System.out.println("test1 out");
	}

}


事实证明,我错了!!!

翻看相关书籍,发现jvm在执行方法以前,如果发现该方法前面有对象的synchronized关键字,就现在该对象的ID上加锁,当其他线程执行同时执行这个方法时,会检测改对象ID上是否加锁,如果加锁时就等待锁释放。

哈哈,面试了一次长见识了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics