Tag: 互斥

是否有可能在Java中有效地实现seqlock?

另一个问题让我想知道是否可以使用Java中的易失性版本计数器有效地实现seqlock 。 这是一个典型的实现,因为只有一个编写器线程的情况: class Seqlock { private volatile long version = 0; private final byte[] data = new byte[10]; void write(byte[] newData) { version++; // 1 System.arraycopy(newData, 0, data, 0, data.length); // 2 version++; // 3 } byte[] read() { long v1, v2; byte[] ret = new byte[data.length]; do { v1 = version; // 4 […]

Java编写互斥锁的最快方法?

互斥体在许多编程语言中很常见,例如C / C ++。 我在Java中想念他们。 但是,我可以通过多种方式编写自己的class Mutex : 在Mutex上使用简单的synchronized关键字。 使用二进制信号量 。 使用primefaces变量,如此处所讨论的。 …? 什么是最快(最好的运行时)方式? 我认为同步是最常见的,但性能呢?

Java:除了它们所属的对象之外,同步方法是否锁定了什么?

现在,我不确定这是否是一个愚蠢的问题,如果是的话,请耐心等待。 对象上的锁是“递归的”,即如果两个对象在其字段中引用了第三个对象,并且一个线程正在其中一个上运行同步方法,那么任何其他线程是否可以访问第三个对象? // a and b are some objects that implement Runnable // they both reference the same third object a.ref = c; b.ref = c; // a is run in a thread and processes some data in a loop for a long time // the method the loop belongs to is declared synchronized threadA […]

在Java中实施Burns和Lynch的互斥算法:由于指令重新排序会有问题吗?

在下面的论文中,我在第4页(836)找到了一个相当简单的n进程互斥算法: Burns和Lynch的“使用不可分割读写的相互排斥” program Process_i; type flag = (down, up); shared var F : array [1..N] of flag; var j : 1..N; begin while true do begin 1: F[i] := down; 2: remainder; (* remainder region *) 3: F[i] := down; 4: for j := 1 to i-1 do if F[j] = up then goto 3; […]

我可以在Java中使用Semaphore实现阻塞队列吗?

我想知道是否可以使用Semaphore来实现阻塞队列? 在下面的代码中,我使用一个信号量来保护关键部分,并使用另外两个信号量对象来跟踪空槽和填充对象的数量。 public class BlockingQueue { private List queue = new LinkedList(); private int limit; private Semaphore slots; // semaphore for empty slots private Semaphore objs; // semaphore for filled slots private Semaphore mutex; // for the critical section public BlockingQueue(int limit) { this.limit = limit; this.slots = new Semaphore(limit); // initial empty slot = […]

仅在尚未运行的情况下启动Java程序

我需要在我的Java应用程序中启动1-3个具有用户定义的路径的外部程序。 我的要求很少: 如果程序已在运行,我不希望程序执行 我不希望任何程序从我的Java应用程序中窃取焦点 我不在乎他们中的任何一个是否未能启动。 他们只需要默默地失败。 这是我到目前为止所提出的: ProcessBuilder pb = new ProcessBuilder(userDefinedPath1); try { pb.start(); } catch (Exception e) { // Something went wrong, just ignore } 然后我用另外两条路径再重复3次。 这开始就像我期望的那样,并且满足我的第三个要求就好了,但是前两个失败了。 做这个的最好方式是什么? 编辑: 我对这些其他应用程序没有任何控制权。 他们是第三方。 此外,用户可以随时手动启动或停止它们。 我知道可执行文件的确切名称(例如“blah.exe”)并且它们将始终相同,但可执行文件的路径不一定如此。 批处理文件包装器在这里是不可行的。 其他应用程序不是 Java应用程序,只是普通的旧Windows可执行文件。

在Java中获得独有的系统范围锁定

我正在重新编写可以多次启动的Java可执行文件,我希望该过程一次完成一个。 在C#中,我会使用命名/系统Mutex执行此操作,但这在Java中似乎不可能。 我该如何实现此function?