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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

多线程(同步代码块和同步函数)

發布時間:2023/12/13 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程(同步代码块和同步函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程安全問題

??? 當多條語句在操作同一個線程共享數據時,一個線程對多條語句只執行了一部分,還沒有執行完,
?? ?另一個線程參與進來執行。導致共享數據的錯誤。

解決辦法:
?? ?對多條操作共享數據的語句,只能讓一個線程都執行完。在執行過程中,其他線程不可以參與執行。

Java對于多線程的安全問題提供了專業的解決方式。
就是同步代碼塊。

synchronized(對象)
{
?? ?需要被同步的代碼
}
對象如同鎖。持有鎖的線程可以在同步中執行。
沒有持有鎖的線程即使獲取cpu的執行權,也進不去,因為沒有獲取鎖。

同步的前提:
1,必須要有兩個或者兩個以上的線程。
2,必須是多個線程使用同一個鎖。


必須保證同步中只能有一個線程在運行。

好處:解決了多線程的安全問題。
弊端:多個線程需要判斷鎖,較為消耗資源,

?

多線程程序中如何找問題(那些代碼該同步、那些不該同步):

1.明確那些代碼是多線程運行代碼。

2.明確共享數據。

3.明確多線程運行代碼中那些語句是操作共享數據的。

同步函數(將關鍵字synchronized作為修飾符修飾函數,使其具有同步性)

//同步函數 class bank {int money;//將同步關鍵字synchronized方在方法中作為修飾符,使方法具有同步性public synchronized void add(int i){money = money+i;} }class people implements Runnable {private bank b = new bank();public void run(){for(int i=0;i<3;i++){b.add(100);System.out.println(Thread.currentThread().getName()+"存入了"+100+"元");System.out.println("金庫中的金額為:"+b.money);}} }class userMain {public static void main(String [] args){people p = new people();Thread t1 = new Thread(p);Thread t2 = new Thread(p);t1.start();t2.start();} } View Code

?同步函數中使用的鎖是this

如果同步函數被靜態修飾后,使用的鎖是什么呢?

通過驗證,發現不在是this。因為靜態方法中也不可以定義this。

靜態進內存是,內存中沒有本類對象,但是一定有該類對應的字節碼文件對象。
類名.class? 該對象的類型是Class


靜態的同步方法,使用的鎖是該方法所在類的字節碼文件對象。 類名.class

轉載于:https://www.cnblogs.com/gzc911/p/4905841.html

總結

以上是生活随笔為你收集整理的多线程(同步代码块和同步函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

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