2013-05-07 65 views
0

我是新來的併發。我想確保多個客戶端可以以線程安全莊園的方式訪問和更改書籍ArrayList。以下是否正確?我正在嘗試使用簡單的產品消耗模型。同時爲多個用戶同步ArrayList

protected List<Book> books = Collections.synchronizedList(new ArrayList<Book>()); 

// producer consumer model 
    protected Object[] produce(JTextField input) { 
     synchronized (books) { 
      if (isInteger(input.getText())) { 
       for (Book b : books) { 
        if (Integer.parseInt(b.BookID) == Integer.parseInt(input 
          .getText())) { 
         b.Available = Integer.toString((Integer 
           .parseInt(b.Available) + 1)); 
         saveTextRecord(); 
         // show on table 
         return toTableDisplayObject(b.toString()); 
        } 
       } 
      } 
     } 
     return null; 
    } 

    protected Object[] consume(JTextField input) { 
      synchronized (books) { 
       if (isInteger(input.getText())) { 
        for (Book b : books) { 
         if (Integer.parseInt(b.BookID) == Integer.parseInt(input 
           .getText())) { 
          b.Available = Integer.toString((Integer 
            .parseInt(b.Available) - 1)); 
          saveTextRecord(); 
          // show on table 
          return toTableDisplayObject(b.toString()); 
         } 
        } 
       } 
      } 
      return null; 
    } 

正面在使用擺動這可能是明顯的,這個前端是多個用戶將使用。 isInteger()只是返回一個布爾值,表示輸入值是否爲一個整數。 toTableDisplayObject()用於將ArrayList轉換爲擺動表使用的格式。

+1

退一步是所有的用戶將使用相同的應用程序實例嗎? – BevynQ 2013-05-07 21:29:05

+0

所有用戶都將使用上述代碼所在的類的相同實例。 – 2013-05-07 21:31:41

+1

我會將列表設置爲私有。我也不會返回null,而是返回一個空數組。從併發的角度來看,我看不到任何問題,但它不會很好地擴展(這可能不是問題)。 – BevynQ 2013-05-07 21:53:42

回答

0

這是一個糟糕的設計。只有一位消費者能夠接受資源。嘗試使用ReadWriteLock或2個信號燈來設計設計。