`
bjmike
  • 浏览: 283934 次
  • 性别: 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上是否加锁,如果加锁时就等待锁释放。

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

相关推荐

    超级有影响力霸气的Java面试题大全文档

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...

    java程序员面试必备的32个要点.doc

    - 抽象类:包含抽象方法,可以有构造方法和非抽象方法,一个类只能继承一个抽象类。 - 接口:纯抽象,只能声明常量和抽象方法,一个类可以实现多个接口。 18. **多线程同步机制**: - synchronized:关键字用于...

    iOS并发编程指南

    - **监测信号**:通过`makeSignalSource`方法创建一个监测信号的`DispatchSource`。 - **监控进程**:通过`makeProcessSource`方法创建一个监控进程状态的`DispatchSource`。 ##### 4.3 取消一个DispatchSource ...

    质数金融笔试题1

    - 非聚簇索引(二级索引)索引项与数据行分开存储,数据行可能按不同的顺序排列,一个表可以有多个非聚簇索引。 - 索引底层实现原理通常基于 B+树、B树或哈希表等数据结构。 13. **索引实现原理**: - B+树:...

    Java实现和维护系统详解.pdf

    `if (log.isLoggable(Level.FINE))`这一行首先检查日志级别是否允许输出FINE级别的信息,如果允许才执行`log.log()`方法,这样可以避免在不记录日志时执行昂贵的计算。 在Java中,JVM(Java虚拟机)能够进行一些...

    并发编程

    线程是操作系统调度的基本单位,一个进程中可以有多个线程。进程则是资源分配的最小单位,每个进程有自己的内存空间。同步是为了避免多个线程对共享资源的冲突,常见的同步机制有互斥锁、信号量、条件变量等。通信是...

    多线程短发

    - **Objective-C的NSThread**:`NSThread` 是Objective-C中用于创建和管理线程的一个类。 - **C语言的GCD接口**:GCD (Grand Central Dispatch) 是苹果为多核硬件设计的一种多线程技术,其性能最佳且代码更加简洁。 ...

    多线程实例

    - **Java中的多线程**:Java提供了Thread类和Runnable接口来创建和管理线程,还有synchronized关键字用于同步,以及wait()、notify()和notifyAll()方法来控制线程间的协作。 - **Python中的多线程**:Python的...

    阿里巴巴01

    在实现负载均衡时,可能会涉及到链表的操作,例如在两个链表中找到公共的第一个节点。为了找到这个公共节点,我们需要遍历两个链表,分别获取它们的长度,并计算长度差。然后从较长的链表开始遍历,当遍历次数等于两...

    百度校园招聘历年经典面试题汇总:Android岗

    - **多个方法**:如果多个方法都加上`synchronized`关键字,则这些方法在同一时刻只能被一个线程访问。 #### 45. public与默认的区别 - **public**:任何地方都可以访问。 - **默认**:仅限于同一包内。 #### 46....

    MultiCoreComputing:UT奥斯汀分校2015年夏季多核计算课程的一对编程工作

    6. **Java并发库**:熟悉`Fork/Join`框架,它是Java 7引入的一个高级并行处理框架,特别适合于解决可分割的问题。 7. **并发集合**:了解Java并发集合,如`ConcurrentHashMap`,它们内部实现了线程安全,能够在多...

Global site tag (gtag.js) - Google Analytics