1. java lock 是鎖對象還是代碼塊
主要為了多線程訪問共享資源時,保證只能有一個線程操作資源,比如說一個servlet中對根據參數
一個公共變數設置值
,如果不採用lock那麼在並發訪問時就無法保證每個線程中公共變數設置的值都是各自線程的,在後續的應用中變數的值可能會錯亂,加了lock之後就保證了在一個線程中從頭到尾都是一致的
2. java對象鎖與類鎖區別
Java每一個class都提供類似於moniter的保證同步,保護共享數據的操作。
正如你所說,notify是喚醒一個等待的線程,如果沒有任何線程在等待,Notify將沒有任何操作。
只有當對象上有線程陷入等待時,調用notify會喚醒第一個陷入等待的線程。
3. Java鎖 到底鎖的是哪個對象
鎖並不是鎖的對象 是鎖的內存
參考下java虛擬機
4. java中synchronized鎖對象的問題
censhi007 是對的。LZ你鎖住某個對象b的話,那你只能保證在synchronized內調用b對象的方法或者屬性的「那一句語句」時,別的線程(同樣通過synchronized請求調用對象b)會被堵塞。
如果說要詳細的說,那就是你在synchronized(b)m2裡面,b = 2000這一句語句運行的那個時間內,m1裡面的b = 1000這一句不能同時運行,會等待b = 2000運行完才運行。呃,很顯然,在這里synchronized(b)連個毛用都沒有了。。
但是如果你是調用b對象的某一個方法a()的話,那麼在運行方法a的整個過程,m1不能同時運行方法a(),這樣就有那麼點用處了。。
而yzn6370823 說的在一定程度上也沒錯。你根本不能保證m1和m2哪一個synchronized塊會被先調用。
同時,你在
public void m2()throws Exception {
synchronized(this){
b = 2000;
Thread.sleep(1000);
}
System.out.println("m2:" + b);
}
中,把 System.out.println("m2:" + b);放到synchronized外是不對的,因為你的意圖應該是m2輸入被鎖住的時候的值吧,如果你RP不好,說不準m2就輸出1000了。
5. java為什麼要對對象加鎖
對象是一個鎖標志。按照先到先得的原則,如果有多個線程都會執行代碼,並使用同一個對象作為鎖,
synchronize(對象){
....
}
那麼,先執行這段代碼的那個線程,將會獲得這個對象鎖,而當這個線程執行這段代碼的時候,其他線程也是使用這個對象作為鎖的,就不能執行這段代碼,知道最初得到這個鎖的線程運行完這段代碼,然後再把鎖分配給下一個線程執行。
6. java中的同步代碼塊,為什麼隨便放個對象,就可以鎖住代碼塊呢什麼原理
synchronized(這里的對象你看成一道門) {
這里是一個人進來了,把門反鎖了
需要同步操作的代碼
這里是裡面的人事情做完了,出去了,門開著其他人可以進了
}
至於怎麼鎖的,這是java和jvm的規定和實現細節,作為普通程序員沒必要深入那麼多。
7. java對象鎖問題,求解
線程執行順序是隨機的,這就是多線程,synchronized只能保證結果是正確的。。因為你這個run方法是同時start的。
8. java的多線程,對象鎖與對象監視器有什麼區別
對象監視器用來
監視多個線程處理同一個共享數據,比如成員變數,
對於你說的那個大括弧裡面的對象
這個對象你可以自己定義,比如
string
str=new
stirng("11");
object
obj=new
object();這都可以
這個對象
主要用來
標示的
就好比是一個鎖,如果你兩個線程都要訪問一個共享數據的話,當然
這個對象要是一樣的,synchronized(對象){
}這里的對象
必須的有,這是規范
我說的都是理解的,簡易
你最好是看看這方面的視頻,線程挺重要的,