为了在两个进程之间进行通信,我建议您使用ServerSocket和Socket来管理进程同步。您可以绑定到特定的端口(获取锁),如果已经有一个进程绑定了该端口,则可以连接到该套接字(阻塞)并等待服务器套接字关闭。
private static int KNOWN_PORT = 11000;//arbitrary valid port
private ServerSocket socket;
public void acquireProcessLock(){
socket = new ServetSocket(KNOWN_PORT);
INetAddress localhostInetAddres = ...
try{
socket.bind(localhostInetAddres );
}catch(IOException failed){
try{
Socket socket = new Socket(localhostInetAddres ,KNOWN_PORT);
socket.getInputStream().read();//block
}catch(IOException ex){ acquireProcessLock(); } //other process invoked releaseProcessLock()
}
}
public void releaseProcessLock(){
socket.close();
}
不确定这是否是实际最佳方法,但我认为值得考虑。
同步仅适用于Java中的线程,而不适用于进程。它们在跨进程工作时没有任何效用,因为进程不共享需要同步的状态。一个进程中的变量与另一个进程中的变量不会具有相同的数据。
从系统角度来看,线程由其"状态"和"指令指针"定义。
指令指针(eip)包含下一条要执行的指令的地址。
线程的"状态"可以是:寄存器(eax、ebx等)、信号、打开的文件、代码、堆栈、由该线程管理的数据(变量、数组等)以及堆。
进程是一组共享部分"状态"的线程:它可能是代码、数据、堆。
编辑: 进程可以通过IPC(进程间通信)进行通信。有3种机制:共享内存、消息队列。进程之间的同步可以使用信号量进行。
线程同步可以使用互斥锁(pthread_mutex_lock,pthread_mutex_unlock等)来实现
请查看Terracotta Cluster或Terracotta的DSO Clustering文档,了解如何解决此问题(字节码操作,维护Java语言规范在putfield/getfield级别上的语义等)。
简单来说,进程比线程更独立。
它们的主要区别在于内存层面。不同的进程之间没有任何共享,从寄存器、栈内存到堆内存,这使得它们各自安全地运行。然而,通常线程被设计为共享一个公共的堆内存,这为多个进程计算任务提供了更紧密的连接方式。创造了一种更有效的占用计算资源的方式。
例如,如果我使用3个进程进行计算,我必须让它们每个人完成工作并在系统级别等待其结果,同时,寄存器和栈内存总是被占用。然而,如果我使用3个线程,则如果线程2幸运地更早地完成其工作,因为它计算出的结果已经存储在公共堆内存池中,我们可以简单地杀死它,而不必等待其他线程交付其结果,这样释放的寄存器和栈内存资源可以用于其他目的。
最简单的答案是,进程意味着正在执行的程序,而程序只是函数的集合。 线程是进程的一部分,因为所有线程都是函数。 换句话说,一个进程可以有多个线程。 操作系统总是为进程分配内存,并将该内存分配给该进程的线程。操作系统不会为线程分配内存。
进程:
线程:
注意:每个线程至少需要一个进程。
我想进程可以通过第三方方式进行通信:文件或数据库...
Semaphore
类是一个纯粹的进程内工具。一般来说,大多数操作系统都提供了用于跨进程同步的信号量机制,但这在 Java 代码中不容易访问。 - Joachim Sauer