0

私は同時実行が初めてです。複数のクライアントがブックの 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 をスイング テーブルで使用するための形式に変換するために使用されます。

4

1 に答える 1

0

これは悪い設計です。一度に 1 つのコンシューマーのみがリソースにアクセスできます。設計を強化するには、ReadWriteLock または 2 つのセマフォを試してください。

于 2013-05-08T02:51:44.227 に答える