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;
    }

前端使用 swing 可能很明显,这个前端是多个用户会使用的。isInteger() 仅返回一个布尔值,用于判断作为字符串输入的值是否为整数。toTableDisplayObject() 用于将 ArrayList 转换为摆动表使用的格式。

4

1 回答 1

0

这是一个糟糕的设计。一次只有 1 个消费者可以访问该资源。尝试 ReadWriteLock 或 2 Semaphores 来增强设计。

于 2013-05-08T02:51:44.227 回答