Java多執行緒 synchronized同步方法

2021-08-20 11:40:26 字數 1858 閱讀 8494

synchronized同步方法是為了解決「非執行緒安全」的問題,所謂「非執行緒安全」是指多個執行緒對同乙個物件中的變數進行併發訪問時發生,產生「髒讀」的情況。

「非執行緒安全」問題存在於「例項變數」中,如果是方法內部的私有變數,則不存在「非執行緒安全」問題,也就是「執行緒安全」的了。

demo:

hasselfprivatenum類:

public

class hasselfprivatenum else

system.out.println(username+" num="+num);

}catch (interruptedexception e)

}}

a執行緒類

public

class

threada

extends

thread

@override

public

void

run()

}

b執行緒類:

public

class

threadb

extends

thread

@override

public

void

run()

}

main方法:

public

class run

}

執行結果:

a

set over!

b set over!

b num=200

anum=100

從結果可以看出這是執行緒安全的且永久安全,這是方法內部的變數私有的特性的原因(num變數是屬於方法內部的)。

如果多個執行緒共同訪問1個物件中的例項變數,則有可能出現「非執行緒安全」的問題;

用執行緒訪問的物件中如果有多個例項變數,則執行的結果有可能出現交叉的情況;

如果物件僅有1個例項變數,則有可能出現覆蓋的情況。

修改hasselfprivatenum類,如下:

public

class hasselfprivatenum else

system.out.println(username+" num="+num);

}catch (interruptedexception e)

}}

執行main方法,結果如下:

a

set over!

b set over!

b num=200

anum=200

本例項中兩個執行緒同時操作業務物件中的例項變數,產生了覆蓋的情況,出現了「執行緒不安全」的問題。

解決方法:

在public void addi(string username)方法錢加關鍵字synchronized即可,如下:
public

class hasselfprivatenum else

system.out.println(username+" num="+num);

}catch (interruptedexception e)

}}

執行main方法,結果如下:

a

set over!

anum=100

b set over!

b num=200

當多個執行緒訪問同乙個物件中的同步方法時一定是執行緒安全的。

因為是同步訪問,所以先列印a,然後列印出b。

java多執行緒

在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...

Java 多執行緒

1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...

JAVA 多執行緒

為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...