如果一個對象的方法是同步的,另一個不是,那麼兩個不同的線程可以同時運行它們嗎?我知道當一個方法被標記爲同步時,內部鎖必須被獲取,但第二個方法不同步,這是否重要?或者,如果一個線程獲得鎖定,所有的方法都不能輸入?兩個方法(一個同步另一個不)和兩個線程
-1
A
回答
1
是的。兩個線程可以同時執行這兩種方法。線程可以鎖定同步方法,但鎖定不需要執行非同步方法。
1
我相信這兩種方法可以在同一個對象上同時運行,這是因爲其中一個是只會讓使用該對象&獲取它的內部鎖的,但作爲非同步的方法不會利用鎖,他們都可以同時運行。我碰到相同的情況&發現關於聲明正確。見下面的例子更加清晰:
class LockTest {
// Sync Method. Will acquire the lock
public synchronized void meth1() {
System.out.println(Thread.currentThread().getName()
+ " is executing method1.");
try {
Thread.sleep(1000); // to show some processing, Won't release the
// lock
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out
.println(Thread.currentThread().getName() + " ended method1.");
}
// No lock is required in this method
public void meth2() {
try {
Thread.sleep(1);// to let meth1 execute first & acquire the lock
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " is executing method2.");
System.out
.println(Thread.currentThread().getName() + " ended method2.");
}
public static void main(String[] args) throws Exception {
final LockTest oracle = new LockTest();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
oracle.meth1();
}
}, "BigThread");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
oracle.meth2();
}
}, "SmallThread");
t1.start();
t2.start();
t1.join();
t2.join();
}
}
以上代碼生成輸出爲:
BigThread is executing method1.
SmallThread is executing method2.
SmallThread ended method2.
BigThread ended method1.
輸出顯示method2
而method1
也相同對象oracle
上同時執行的執行。
相關問題
- 1. 一個synchronizedSet同步兩個線程
- 2. 兩個線程一個同步方法scjp
- 3. 兩個線程調用同一個方法時線程同步的困惑
- 4. 兩個線程調用一個方法
- 5. 兩個不同點擊兩個div,一個在另一個
- 6. 無法同步兩個線程
- 7. 兩個線程訪問同一個LinkedList
- 8. 的java多線程(在一個類中的兩個同步的方法)
- 9. 每K步兩個線程同步
- 10. 同時使用兩個線程訪問兩個同步塊
- 11. 兩個不同的表,兩個提取信息的另一個
- 12. 兩個線程可以同時訪問同步方法嗎?
- 13. 在一個實例中的Java兩個同步的方法
- 14. 寫兩個線程寫同一個實體的不同字段
- 15. 做兩個步驟 - 一個接一個
- 16. 類有2個同步方法..當一個線程在第二個方法裏面時另一個線程可以進入第一個方法嗎?
- 17. 同時執行兩個同步方法
- 18. 使用AutoResetEvent同步兩個線程
- 19. 如何同步這兩個線程?
- 20. 通過兩個線程同步ArrayList
- 21. 使用兩個隊列同步線程
- 22. 正確同步兩個線程
- 23. 同步對象在一個線程鎖定,而在另一個
- 24. Android - 線程問題。一個靜態工作線程和兩個不同的AsyncTasks
- 25. 兩個SoapClient請求兩個不同的第三方WSDL服務,一個工作,另一個不工作
- 26. Java同步類和這個由兩個線程
- 27. 調用同步方法的同步方法,兩個同一對象
- 28. 同步一個方法不同的Sidekiq線程並等待
- 29. 在另一個同步方法中引用同步方法
- 30. 如何在一個方法中處理兩個線程暫停
你爲什麼不嘗試呢?你爲什麼不讀[教程](http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html)? –
取決於您獲得的鎖的類型。對象級別或類級別。 –