日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?2nd

?

日前在網上見到一道Java筆試試題,如題所述。給出的答案如下:

答:不能,一個對象的一個synchronized方法只能由一個線程訪問。

?

本人認為有些所答非所問。故寫了兩個demo進行測試。發現答案要分三種情況討論。

?

情況一:

當一個線程進入一個對象的一個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 !") ;

??? }

?

}

?

?

運行結果:

一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個對象的另一個同步方法。

?

轉載于:https://www.cnblogs.com/duadu/archive/2009/04/26/6335672.html

總結

以上是生活随笔為你收集整理的笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。