Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在线程之间共享对象_Java_Multithreading_Synchronization_Volatile - Fatal编程技术网

Java在线程之间共享对象

Java在线程之间共享对象,java,multithreading,synchronization,volatile,Java,Multithreading,Synchronization,Volatile,我有一个数据库对象,它将对象存储在各种数据结构中。多个线程访问此数据库,但数据库并不总是最新的。 如果我在一个线程中更改了对象的名称,那么只有在其他线程尚未访问该对象时,更改才会反映在其他线程中。 如果我在一个线程中添加一个新项目,所有线程都可以查看此项目 我已经尝试将数据库对象声明为volatile,但问题仍然存在,我完全没有办法 谢谢 编辑:问题被追溯到未在my objectOutputStream上调用.reset()您需要同步对数据库对象实例的访问 Java中有两种基本的同步习惯用法:

我有一个数据库对象,它将对象存储在各种数据结构中。多个线程访问此数据库,但数据库并不总是最新的。 如果我在一个线程中更改了对象的名称,那么只有在其他线程尚未访问该对象时,更改才会反映在其他线程中。 如果我在一个线程中添加一个新项目,所有线程都可以查看此项目

我已经尝试将数据库对象声明为volatile,但问题仍然存在,我完全没有办法

谢谢


编辑:问题被追溯到未在my objectOutputStream上调用
.reset()

您需要同步对数据库对象实例的访问

Java中有两种基本的同步习惯用法:

  • 同步方法(将
    synchronized
    关键字应用于访问数据库对象实例的方法)
  • synchronized语句(将访问数据库对象实例的代码包装在
    synchronized
    块中)

好吧,如果数据是新实例,您可以复制该数据,并对该实例进行操作 比如memcached缓存设计。 步骤: 1.get实例 2.复制实例 3.修改实例
4.使用

每个线程都是以数据库作为构造函数的参数构造的,因此我无法真正同步对数据库实例的访问,但数据库的所有add和get方法都是同步的。将synchronized关键字附加到get和add方法并不能解决此问题。因为它阻止两个(或多个)线程同时调用add或get方法,但不阻止一个线程同时调用get方法和add方法。在您的情况下,可能需要使用synchronized语句来同步对用于存储数据库数据的数据结构的访问。但是,如果您希望我们帮助您,您需要提供正在处理的代码。谢谢,我会尝试一下。即使只有一个线程访问数据库,对数据库进行了更改,但线程从未看到这些更改。@user2352030如果所有线程都必须将数据库对象作为参数,而您不能更改实现,那么唯一的解决方法是将数据库对象创建为singleton,并在构造所有线程时传递相同的数据库对象实例……是否处理了此数据库对象手动作为缓存?是的,最好使用真正的缓存库,而不是从已经支持多线程的灰烬中编写缓存库。例如ehcache和infinispan。这是一个学校项目,所以我们不允许使用任何第三方图书馆。不过我会看看的,谢谢!