当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
来源:互联网 发布:百视通下载软件 编辑:程序博客网 时间:2024/06/06 20:21
日前在网上见到一道Java笔试试题,如题所述。给出的答案如下:
答:不能,一个对象的一个synchronized方法只能由一个线程访问。
本人认为有些所答非所问。故写了两个demo进行测试。发现答案要分三种情况讨论。
情况一:
当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。
代码如下:
package com.mutithreading.Object;
public class InvokedObject
{
public synchronized void synchronizedMethod()
{
System.out.println("InvokedsynchronizedMethod !") ;
try {
Thread.sleep(10000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void generalMethod()
{
System.out.println("InvokedgeneralMethod ...") ;
}
}
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject;
public class ThreadOne implements Runnable {
private InvokedObjectobject ;
public ThreadOne(InvokedObject object)
{
this.object = object ;
}
public void run() {
object.synchronizedMethod() ;
}
}
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject;
public class ThreadTwo implements Runnable {
private InvokedObjectobject ;
public ThreadTwo(InvokedObject object)
{
this.object = object ;
}
public void run() {
// TODOAuto-generatedmethod stub
object.generalMethod() ;
}
}
packagecom.mutithreading.client;
importcom.mutithreading.Object.InvokedObject;
importcom.mutithreading.threads.ThreadOne;
importcom.mutithreading.threads.ThreadTwo;
publicclass Client {
/**
* @param args
*/
public static void main(String[] args) {
InvokedObject object = new InvokedObject() ;
ThreadOne one = new ThreadOne(object) ;
ThreadTwo two = new ThreadTwo(object) ;
Thread threadOne = new Thread(one) ;
Thread threadTwo = new Thread(two) ;
threadOne.start() ;
threadTwo.start() ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。
情况二:
当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。(代码略)
情况三:
当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。
此处仅给出对InvokedObject类做出的修改代码:
package com.mutithreading.Object;
public class InvokedObject
{
public synchronized void synchronizedMethod1()
{
System.out.println("InvokedsynchronizedMethod1 !") ;
try {
Thread.sleep(10000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void synchronizedMethod2()
{
System.out.println("InvokedsynchronizedMethod2 !") ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。
- 当一个线程进入对象的synchronized方法后,其它线程是否可进入此对象的其它方法?
- 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
- 当一个线程进入一个对象的一个synchronized( )方法后,其它线程是否可进入此对象的其它方法
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可 进入此对象的其它方法?
- I/O概述
- maven jetty java.lang.OutOfMemoryError: PermGen...
- C# .Net 共享内存 内存映射文件 Memory Mapped 转
- Number of 1 Bits
- Hadoop、MapReduce、YARN和Spark的区别与联系
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- Android官方提供的支持不同屏幕大小的全部方法
- 新浪微博开发五(导航栏功能的实现)
- 【BZOJ 1642】 [Usaco2007 Nov]Milking Time 挤奶时间
- android坐标系解析
- Struts2+JDBC 连接MySql验证登陆用户
- Spatial Statistics Tools(空间统计工具)
- web报表工具FineReport常用函数的用法总结(文本函数)
- mysql-load data local infile