一个java面试题

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(2nd)



日前在网上见到一道Java笔试试题,如题所述。给出的答案如下:

答:不能,一个对象的一个synchronized方法只能由一个线程访问。



。发现答案要分三种情况讨论。



情况一:

当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。

代码如下:

package com.mutithreading.Object;



public class InvokedObject

{



public synchronized void synchronizedMethod()

{

System.out.println("Invoked synchronizedMethod !") ;

try {

Thread.sleep(10000) ;

} catch (InterruptedException e) {

e.printStackTrace();

}

}



public void generalMethod()

{

System.out.println("Invoked generalMethod ...") ;

}



}





package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;



public class ThreadOne implements Runnable {



private InvokedObject object ;



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 InvokedObject object ;



public ThreadTwo(InvokedObject object)

{

this.object = object ;

}



public void run() {

// TODO Auto-generated method stub

object.generalMethod() ;

}



}



package com.mutithreading.client;

import com.mutithreading.Object.InvokedObject;

import com.mutithreading.threads.ThreadOne;

import com.mutithreading.threads.ThreadTwo;



public class 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("Invoked synchronizedMethod1 !") ;

try {

Thread.sleep(10000) ;

} catch (InterruptedException e) {

e.printStackTrace();

}

}



public synchronized void synchronizedMethod2()

{

System.out.println("Invoked synchronizedMethod2 !") ;

}



}





运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法


在网上找到的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值