Tag: 同步

Java中“this”或私有对象的同步?

可能重复: 在Java中避免同步(this)? 这两段代码有什么区别? 每个的优点和缺点是什么? 1) public class Example { private int value = 0; public int getNextValue() { synchronized (this) { return value++; } } } 2) public class Example { private final Object lock = new Object(); private int value = 0; public int getNextValue() { synchronized (lock) { return value++; } } }

在同步块内执行新线程

如果我在同步块中创建一个新线程,该块是否会保持锁定状态,直到线程执行完成为止? 如果没有,那么它什么时候会被锁定? String sLine; onClick(String line){ synchronized (lock) { sLine = line; new Thread(new Runnable() { @Override public void run() { doProcessing(Sline); }).start(); } }

为什么使用私有锁而不是内部锁?

在阅读同步时,我遇到了“监控模式”来封装可变状态。 以下是示例代码 public class MonitorLock { private final Object myLock = new Object(); Widget widget; void someMethod() { synchronized(myLock) { // Access or modify the state of widget } } } 以任何方式更好地拥有私人锁而不是内在锁吗?

同步成本

在一个高度并发的Java程序中,并假设我的方法正确编写并正确同步,我想知道如何确定哪个更好: void synchronized something() { … } 要么 void something() { synchronized(this) { … } // here do stuff no requiring synchronization . . // do computation ‘A’ . synchronized(this) { … } // here do other stuff no requiring synchronization . . // do computation ‘B’ . synchronized(this) { … } } 现在我意识到如果计算’A’和’B’需要花费很多时间,那么第二个版本显然更好。 然而,我的问题是:你知道第二个版本更高效吗? […]

Java:如何检查是否可以获取锁?

如果我想确保用Java独占访问对象,我可以写这样的东西: … Zoo zoo = findZoo(); synchronized(zoo) { zoo.feedAllTheAnimals(); … } 有没有办法检查对象当前是否被锁定? 如果另一个线程正在访问zoo我不希望我的线程等待。 如果zoo没有锁定,我希望我的线程获取锁并执行synchronized块; 如果没有,我希望它跳过它。 我怎样才能做到这一点?

可以多次通知唤醒同一个线程吗?

想象一下,你有一个典型的Java生产者 – 消费者模式。 为了更高效,您希望在将新元素添加到队列时使用notify()而不是notifyAll() 。 如果两个生产者线程调用notify,是否可以保证唤醒两个不同的等待消费者线程? 或者可能是两个notify()在彼此之后不久触发导致同一个comsumer线程排队等待两次唤醒? 我找不到该部分是描述这是如何工作的API。 java是否有一些primefaces内部操作来准确唤醒线程一次? 如果只有一个消费者正在等待,那么第二个通知将丢失,这没有问题。

Java最终字段的值的’最新’保证是否延伸到间接引用?

Java语言规范定义了第17.5节中最终字段的语义: 最终字段的使用模型很简单。 在该对象的构造函数中设置对象的最终字段。 在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。 它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的。 我的问题是 – ‘最新’保证是否扩展到嵌套数组和嵌套对象的内容? 简而言之:如果一个线程将可变对象图分配给对象中的最终字段,并且对象图永远不会更新,那么所有线程都可以通过最终字段安全地读取该对象图吗? 示例场景: 线程A构造一个ArrayLists的HashMap,然后在类’MyClass’的实例中将HashMap分配给final字段’myFinal’ 线程B看到对MyClass实例的(非同步)引用并读取’myFinal’,并访问和读取其中一个ArrayLists的内容 在这种情况下,线程B看到的ArrayList的成员是否保证至少与MyClass的构造函数完成时一样最新? 我正在寻找澄清Java内存模型和语言规范的语义,而不是像同步这样的替代解决方案。 我的梦想答案是肯定或否定,并参考相关文字。 更新: 我对Java 1.5及更高版本的语义感兴趣,即通过JSR 133引入更新的Java内存模型。此更新中引入了最终字段的“最新”保证。

这种同步有什么意义?

这里的同步有什么意义? 为什么不使用mConnectedThread.write(out) ? 代码段来自适用于Android的BluetoothChat示例(可在此处找到) /** * Write to the ConnectedThread in an unsynchronized manner * @param out The bytes to write * @see ConnectedThread#write(byte[]) */ public void write(byte[] out) { // Create temporary object ConnectedThread r; // Synchronize a copy of the ConnectedThread synchronized (this) { if (mState != STATE_CONNECTED) return; r = mConnectedThread; } […]

如何在不同的应用程序级别上锁定文件?

这是场景:我有一个在servlet容器中运行的multithreadingjava Web应用程序。 应用程序在servlet容器中多次部署。 有多个servlet容器在不同的服务器上运行。 也许这个图表清楚地说明了: server1 +- servlet container +- application1 | +- thread1 | +- thread2 +- application2 +- thread1 +- thread2 server2 +- servlet container +- application1 | +- thread1 | +- thread2 +- application2 +- thread1 +- thread2 网络共享目录中有一个文件,所有这些线程都可以访问。 他们经常访问该文件。 大多数情况下,文件只能被这些线程读取。 但有时它是写的。 我需要一个故障安全解决方案来同步所有这些线程,以保证数据的一致性。 不起作用的解决方案(正确) : 使用java.nio.channels.FileLock 我能够使用FileLock类同步来自不同服务器的线程。 但是这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在进程范围内可用。 使用单独的文件进行同步 我可以创建一个单独的文件,指示进程正在读取或写入文件。 此解决方案适用于所有线程,但有几个缺点: 性能。 […]

Java方面的同步和性能

我刚刚意识到我需要在一个方面同步大量的数据收集代码,但性能是一个真正的问题。 如果性能下降太多,我的工具将被抛弃。 我将单独编写int和long,以及各种数组,ArrayLists和Maps。 将有一个应用程序的多个线程将进行将由我的方面拾取的函数调用。 我应该注意哪些事情会对性能产生负面影响? 什么代码模式更有效? 特别是我有一种方法可以调用许多其他数据记录方法: void foo() { bar(); woz(); … } 这些方法主要是添加方面字段的递增 void bar() { f++; // f is a field of the aspect for (int i = 0; i < ary.length; i++) { // get some values from aspect point cut if (some condiction) { ary[i] += someValue; // ary a […]