❶ java synchronized 修飾方法和函數
Java語言的關鍵字,當synchronized用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。
一、當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。
二、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
四、第三個例子同樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。
五、以上規則對其它對象鎖同樣適用。
❷ java中 synchronized同步處理後 為什麼只有一個線程在運行呢
這個跟CPU性能有關, 完全一致的代碼在我的電腦和公司的電腦上, 發現CPU對線程調度與執行速度不一致, 實際測試過,性能好的CPU需要大量增加線程循環執行次數, 我的機器上是10000次), 才能看到其他線程的執行, 而公司的電腦只要循環10次, 就能看到別的線程執行了
當sleep在synchronized同步方法或同步塊之外的時候,三個線程都有執行, 是因為sleep方法會給其他線程運行的機會,而不管其他線程的優先順序, (但在synchronized同步方法里的sleep, 由於被鎖住所以沒有優先順序之說, 也就是說synchronized同步方法里的sleep失效了, 這是我的猜想)
想看到線程具體的執行過程,可以打開JDK bin目錄下的jvisualvm.exe 監視JavaJVM的狀態,如圖:
❸ java 問題,synchronized(),裡面為什麼要帶參數怎麼理解呢
synchronized常用的有三種,第一種,修飾static方法,表示這個靜態方法是同步方法,簡單地說如果現在有一個線程調用這個方法,其他人就不能再調用了。第二種,修飾普通方法,表示同一實例的該方法只能被依次調用。第三種就是你說的這個加參數,表示鎖住某個對象。具體是干什麼的不是很簡單的說清楚的,大部分場景加對象鎖是為了能安全操作這個對象,有些可能只是簡單把這個對象當個鎖而已,synchronized的執行體裡面並不會對這個對象進行任何操作。其實你可以先理解synchronized的本身意義所在,其他的以後慢慢去體會。舉個例子:假設有好多個人要修改一個文本文件,在沒有鎖機制的時候,很可能同時多個人在修改一個文本,肯定會亂套,這個改的被那個覆蓋了之類的等等。如果採用加鎖就可以避免,每個人開始修改的時候先加鎖,改完再釋放鎖,每次只允許一個人修改。
❹ java中Synchronize是什麼
您好,
用synchronize修飾表示這個類或方法為同步的,在運行過程中會上同步鎖,即,如果有一個線程在訪問這個方法,那麼另外一個線程就不能訪問它
synchronized 方法:通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制對類成員變數的訪問:每個類實例對應一把鎖,每個 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的線程方能獲得 該鎖,重新進入可執行狀態。這種機制確保了同一時刻對於每一個類實例,其所有聲明為 synchronized 的成員函數中至多隻有一個處於可執行狀態(因為至多隻有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變數的訪問沖突(只要所有可能訪問類成員變 量的方法均被聲明為 synchronized)。
在 Java 中,不光是類實例,每一個類也對應一把鎖,這樣我們也可將類的靜態成員函數聲明為 synchronized ,以控制其對類的靜態成員變數的訪問。
synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明為 synchronized ,由於在線程的整個生命期內它一直在運行,因此將導致它對本類任何 synchronized 方法的調用都永遠不會成功。當然我們可以通過將訪問類成員變數的代碼放到專門的方法中,將其聲明為 synchronized ,並在主方法中調用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊。
參考資料:http://wenku..com/view/4c8a180d581b6bd97f19ea60.html
希望我的回答幫得到您,來自【網路懂你】團隊,滿意請採納噢~O(∩_∩)O~
❺ java中的同步代碼塊,為什麼隨便放個對象,就可以鎖住代碼塊呢什麼原理
synchronized(這里的對象你看成一道門) {
這里是一個人進來了,把門反鎖了
需要同步操作的代碼
這里是裡面的人事情做完了,出去了,門開著其他人可以進了
}
至於怎麼鎖的,這是java和jvm的規定和實現細節,作為普通程序員沒必要深入那麼多。
❻ synchronized,鎖,多線程同步的原理是咋樣的
你這是三個概念,我就簡單的回答一下吧,讓你先了解一下他們是做什麼的。至於高深的一句兩句也說不完。
(1)synchronized 是java中的關鍵字,它可以修飾方法和代碼塊;它的作用是保證其修飾的方法或代碼塊每次只能進來一個線程執行。其他線程處於等待狀態,只有等佔有這個同步方法或代碼塊的那個線程執行完,其他的線程才能進來執行。
(2)鎖 Lock;它是java util包下的一個介面,它的作用與synchronized 類似,但是它有幾個實現類,還有很多方法,所以Lock的功能比synchronized 強。例如Lock可以讓等待的線程不等待了,去做別的工作。而synchronized 就無法辦到。Lock還有很多其他強大的方法,這里不一一介紹了。
(3)多線程:多線程一般都是用線程池控制,線程池掌握好它的構造參數,也就了解了怎麼用。 多線程原理就是相當於多條馬路,打個比方:十一房價,很多開車的回家,一條高速路很堵,車走的很慢。如果在旁邊多開幾條路,車流量還是那麼大;但是路多了,自然走起來就快了。
程序應用場景:小A與小B通過http通信,這個功能你要用一條線程做的話,就是小A發第一條消息發送成功後,才能發第二條。不然第二條就一直等待著,相當於堵車了。
但是如果你有兩條線程的話,第二條消息就不用等待了,直接讓它走第二個線程。這樣就實現了多線程同步。
❼ java 問題,synchronized(),裡面為什麼要帶參數怎麼理解呢該怎麼寫
synchronized的參數代表的是「對象鎖」。sychronized加鎖的是對象,而不是代碼。
我舉了個例子:
public class Person
{
private String name; //意思差不多就是你那個obj
public setName(String name)
{
synchronized(name)
{
this.name = name;
}
}
}
代表的是不同的線程在synchronized塊里,同時只有一個線程能執行該代碼塊,而類的不同實例之間是互不影響的。比如Person A = new Person(),Person B = new Person().A和B之間是不受synchronized制約的。
而:
public class Person()
{
private String name; //意思差不多就是你那個obj
public setName(String name)
{
synchronized(Person.class)
{
this.name = name;
}
}
}
「Person.class」這個鎖對類級別的。不同的實例之間是同步的,也就是會所A和B必須同步訪問synchronized代碼塊。
關於synchronized這塊若要深入理解,需要對線程有個比較不多的掌握。
推薦樓主看看這個資料:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html
❽ Java中synchronized的作用,什麼情況下使用
synchronized是java中的一個關鍵字
我們稱其為同步關鍵字
主要是用來處理java中的同步機制
同一個資源被用戶並發訪問時,會出現並發問題,比如:有一個實例變數x,第一個用戶訪問它,並賦值為100,但還沒有來得及列印出x,另一個哥們進來訪問了x,並改為200,這時候第一個哥們興高采烈的列印出x的值,但卻發現不是100,是200.這哥們就郁悶了,怎麼回事呢?
這就是並發問題,但如果把上面的代碼用同步代碼塊包含起來,任意一個時間只能有一個哥們訪問實例變數x,一直到這哥們執行完同步代碼塊中的所有代碼後,其他哥們才能再訪問。
❾ java中 synchronized同步處理後 為什麼只有一個線程在運行
java中
synchronized同步處理後,代表該線程是同步的,即多線程訪問時,無法同時有兩個或以上線程進行訪問。具體的原理是,當第一個線程進入該同步代碼塊之後,會暫時獲得同步塊的鎖,當第二個線程進入時,由於第一個線程並未結束,同步代碼塊的鎖沒有釋放,所以第二個線程進不來,達到只有一個線程在運行的目的。synchronized同步處理通常用於封裝需要共享的可改變的數據,為了讓數據更安全所使用的技術。
❿ java 中 synchronized 是什麼意思
一段synchronized的代碼被一個線程執行之前,他要先拿到執行這段代碼的許可權,在java里邊就是拿到某個同步對象的鎖(一個對象只有一把鎖); 如果這個時候同步對象的鎖被其他線程拿走了,他(這個線程)就只能等了(線程阻塞在鎖池等待隊列中)。 取到鎖後,他就開始執行同步代碼(被synchronized修飾的代碼);線程執行完同步代碼後馬上就把鎖還給同步對象,其他在鎖池中等待的某個線程就可以拿到鎖執行同步代碼了。這樣就保證了同步代碼在統一時刻只有一個線程在執行。
關於線程的同步,一般有以下解決方法:
1. 在需要同步的方法的方法簽名中加入synchronized關鍵字。
2. 使用synchronized塊對需要進行同步的代碼段進行同步。
3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock對象