【发布时间】:2016-11-24 17:13:19
【问题描述】:
[已编辑] 这是关于 Java 中对象的同步。我有疑问,需要澄清。
如果我同时在两个线程中访问一个对象 通过一个线程访问其方法,并在另一个线程中将对象重新初始化为空。 这个对象可以同步吗?
【问题讨论】:
-
对象不为空。引用为空。不清楚你在问什么。
标签: java multithreading synchronization
[已编辑] 这是关于 Java 中对象的同步。我有疑问,需要澄清。
如果我同时在两个线程中访问一个对象 通过一个线程访问其方法,并在另一个线程中将对象重新初始化为空。 这个对象可以同步吗?
【问题讨论】:
标签: java multithreading synchronization
您不能“使对象为空”。如果一个线程通过变量访问一个对象,而另一个线程将该变量设置为 null,则第一个线程仍然具有对该对象的引用并且可以访问它。如果第二个线程首先运行,即将变量设置为 null,则第一个线程首先无法获取该引用。
例子:
MyThreadsafeObject ref = new MyThreadsafeObject();
//start another thread and pass in the reference
new Thread( new MTOHandler( ref ) ).start();
ref = null;
//start a 3rd thread and pass in the now-null reference
new Thread( new MTOHandler( ref ) ).start();
此处启动的第一个线程仍然可以使用已传递的对象,而第二个线程则不能,因为它正在获取空引用。
如果您的问题是synchronized( ref ) { ... } 之类的东西,那么只要在启动块时ref 不为空,您就可以在对象上进行同步。
【讨论】: