Java 同时为多个用户同步ArrayList

Java 同时为多个用户同步ArrayList,java,swing,collections,concurrency,synchronization,Java,Swing,Collections,Concurrency,Synchronization,我不熟悉并发。我想确保多个客户端可以在线程安全的庄园中访问和更改books ArrayList。以下是正确的吗?我试图使用一个简单的生产-消费模型 protected List<Book> books = Collections.synchronizedList(new ArrayList<Book>()); // producer consumer model protected Object[] produce(JTextField input) {

我不熟悉并发。我想确保多个客户端可以在线程安全的庄园中访问和更改books 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;
    }
protectedlist books=Collections.synchronizedList(new ArrayList());
//生产者-消费者模型
受保护对象[]生成(JTextField输入){
同步(书籍){
if(isInteger(input.getText()){
(b册:书籍){
if(Integer.parseInt(b.BookID)=Integer.parseInt(输入
.getText()){
b、 可用=整数。toString((整数
.parseInt(b.Available)+1);
saveTextRecord();
//摆在桌子上
返回toTableDisplayObject(b.toString());
}
}
}
}
返回null;
}
受保护对象[]使用(JTextField输入){
同步(书籍){
if(isInteger(input.getText()){
(b册:书籍){
if(Integer.parseInt(b.BookID)=Integer.parseInt(输入
.getText()){
b、 可用=整数。toString((整数
.parseInt(b.Available)-1);
saveTextRecord();
//摆在桌子上
返回toTableDisplayObject(b.toString());
}
}
}
}
返回null;
}

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

这是一个糟糕的设计。一次只有一个使用者可以访问该资源。尝试ReadWriteLock或2个信号灯来支持设计。

后退一步,所有用户都将使用同一个应用程序实例吗?所有用户都将使用上述代码所在的类的同一个实例。我会将列表设置为私有。另外,我不会返回null,而是返回一个空数组。从并发的角度来看,我看不到任何问题,但是它不能很好地扩展(这可能不是问题)。也许你应该考虑使用向量:“不同于新的集合实现,向量是同步的。如果不需要线程安全的实现,建议使用ARARYLAMP代替向量。”(虽然这只确保向量本身的一致性,而不是它与其他实体的关系。)@DavidTunnell,是的,假设您正在同步示例代码中未出现的任何方法,则无需使用向量或同步集合包装器。