0
  1. 一個對象有兩個同步列表屬性(listA和listB)和一個名爲add(...)的方法,它將一個元素添加到這兩個列表中。我的問題是:如果從不同的線程調用此方法,該方法是否應該同步?
  2. 在同步方法中使用SwingUtilities.invokeLater方法時會出現問題嗎?
  3. 當使用synchronized(this){.. code ...}時,在這種情況下,當一個線程訪問代碼塊時,是否僅阻塞了對象(this)的代碼塊或所有方法?
+1

',對象具有兩個同步列表attributes'屬性不能在Java中同步 – CKing

+0

我的意思是:。私人列表 listA的=集合.synchronized List(new ArrayList <>()); \t private列表 listB = Collections.synchronizedList(new ArrayList <>()); – sch

回答

0

實際上,synchronized方法和synchronized(this){}是一樣的,因爲「this」是指對象,而這個對象將提供鎖。如果使用這些同步中的任何一個,並且一個線程調用一個同步方法,則其他線程無法訪問該對象的所有同步方法。如果您想避免這種情況,請創建一個新變量來提供鎖定,而不是同步該方法。例如

public void add(String s) 
    { 
     private Object block = new Object(); 
     synchronized(block) 
     { 
      listA.add(s); 
      listB.add(s); 
     } 

    } 

    public int count() 
    { 
     return listA.size(); //returns the most recent listA update size 
           // method can be accessed while another thread adds elements to listA 
    } 
0
  1. 一個目的有兩個同步屬性列表(和listA的數組listB),並且將一個元素添加到這兩個列表一個 方法名爲add(...)。我的 的問題是:如果從 調用不同的線程,該方法是否應該同步?

這取決於。如果你想讓listA和listB中的元素順序相同,那麼是的,當你添加到兩個列表中時,你應該同步。否則,如果有可能,你得到的東西在這個順序:

  • 線程A加元素listA的
  • 線程B增加元素listA的
  • 線程B增加元素數組listB
  • 線程A增加元素數組listB

-

  • 當在同步方法中使用方法SwingUtilities.invokeLater時,會出現問題 ?

  • 沒有,有沒有異議。我真的不知道你認爲你可以得到什麼問題。

  • 當使用同步的(這){..代碼...},在此情況下,只有 代碼塊或對象的所有方法(本)當一個線程 訪問代碼塊時被阻塞?

  • 它禁止所有被同步(因爲這意味着相同synchronized (this)和使用synchronized (this)。 此外,所有碼塊的非靜態方法中,在其它類它阻止任何代碼,在同步。同一個對象 靜態方法和非同步方法不會阻止,而你在裏面synchronized (this)

    +0

    謝謝,能否請你解釋一下靜態方法和同步的一種非靜態方法有什麼區別? – sch