❶ java synchronized 有兩種用法一種是方法上加synchronized ,還有一種是什麼
synchronized
語句塊,可以方便的寫在方法內的某段。用法:synchronized
(對象地址){
邏輯
}
synchronized
的意思就是
先獲得對象地址的鎖,那麼就可以先執行那部分代碼。執行完就放開鎖其他線程就可以進來了。
synchronized
void
getName()這個代碼表示
以this類實例為對象地址相當於synchronized
(this){}.
那麼在多線程環境中。如果訪問同一個類同一個實例的這個方法,就會被同步
❷ synchronized 加在java方法前面是什麼作用
java的synchronized加在方法上或者對象上區別如下:
1.synchronized
在方法上,所有這個類的加了
synchronized
的方法,在執行時,會獲得一個該類的唯一的同步鎖,當這個鎖被佔用時,其他的加了
synchronized
的方法就必須等待
2.加在對象上的話,就是以這個對象為鎖,其他也以這個對象為鎖的代碼段,在這個鎖被佔用時,就必須等待
❸ Java中synchronized的作用,什麼情況下使用
synchronized是java中的一個關鍵字
我們稱其為同步關鍵字
主要是用來處理java中的同步機制
同一個資源被用戶並發訪問時,會出現並發問題,比如:有一個實例變數x,第一個用戶訪問它,並賦值為100,但還沒有來得及列印出x,另一個哥們進來訪問了x,並改為200,這時候第一個哥們興高采烈的列印出x的值,但卻發現不是100,是200.這哥們就郁悶了,怎麼回事呢?
這就是並發問題,但如果把上面的代碼用同步代碼塊包含起來,任意一個時間只能有一個哥們訪問實例變數x,一直到這哥們執行完同步代碼塊中的所有代碼後,其他哥們才能再訪問。
❹ java,synchronized問題
前者表示從this對象即當前對象上獲得鎖後,才執行f();
後者是錯誤句子。不能這么寫。synchronzied只能聲明「同步塊」,或者放在方法前面聲明「同步方法」
❺ Java synchronized的問題
問題呢?同步代碼塊
❻ java 中 synchronized 是什麼意思
一段synchronized的代碼被一個線程執行之前,他要先拿到執行這段代碼的許可權,在java里邊就是拿到某個同步對象的鎖(一個對象只有一把鎖);
如果這個時候同步對象的鎖被其他線程拿走了,他(這個線程)就只能等了(線程阻塞在鎖池等待隊列中)。
取到鎖後,他就開始執行同步代碼(被synchronized修飾的代碼);線程執行完同步代碼後馬上就把鎖還給同步對象,其他在鎖池中等待的某個線程就可以拿到鎖執行同步代碼了。這樣就保證了同步代碼在統一時刻只有一個線程在執行。
關於線程的同步,一般有以下解決方法:
1.
在需要同步的方法的方法簽名中加入synchronized關鍵字。
2.
使用synchronized塊對需要進行同步的代碼段進行同步。
3.
使用JDK
5中提供的java.util.concurrent.lock包中的Lock對象
❼ Java的synchronized加在方法上或者對象上有什麼區別
Java的synchronized可以加在方法上,也可以直接加在對象上,從而保證一段代碼只能有一個線程在運行,保證線程的同步。
詳情請見:http://blog.csdn.net/loveyaqin1990/article/details/41313285
❽ java中synchronized問題
synchronized是java中表示同步代碼快的關鍵字。可以放在方法修飾符前,比如private synchronized void test(){},也可以放在方法內部,修飾某一段特定的代碼。可能你貼出完整的代碼會清晰一點,synchronized有一個地方需要注意,就是在給普通方法加鎖與給靜態方法加鎖機制是不一樣的。
synchronized在靜態方法上表示調用前要獲得類的鎖,而在非靜態方法上表示調用此方法前要獲得對象的鎖。
public class StaticSynDemo {
private static String a="test";
//等同於方法print2
public synchronized void print1(String b){ //調用前要取得StaticSynDemo實例化後對象的鎖
System.out.println(b+a);
}
public void print2(String b){
synchronized (this) {//取得StaticSynDemo實例化後對象的鎖
System.out.println(b+a);
}
}
//等同於方法print4
public synchronized static void print3(String b){//調用前要取得StaticSynDemo.class類的鎖
System.out.println(b+a);
}
public static void print4(String b){
synchronized (StaticSynDemo.class) { //取得StaticSynDemo.class類的鎖
System.out.println(b+a);
}
-----------
a.sleep()休眠,但是這個線程沒有結束,也就是說不會釋放synchronized裡面的東西,具體的還要看你的synchronized鎖的范圍和.sleep()在的位置而定