进程是程序在计算机上的一次执行过程,它包含了程序的代码、数据和系统资源。每个进程都有独立的内存空间和系统资源,相互之间互不干扰。进程是程序执行的基本单位,也是操作系统进行资源分配和调度的基本单位。
线程是进程中的一个执行单元,一个进程中可以包含多个线程,这些线程共享同一个进程的内存空间和系统资源。线程之间通信更方便,同时创建和切换线程的开销也比进程小。线程是处理器任务调度和执行的基本单位,多个线程可以并发执行,提高程序的执行效率。
1、线程之间通信:
线程之间通信的主要方式是通过共享内存和消息传递。
共享内存:线程之间共享同一份内存空间,可以直接读写对方的数据。这种通信方式的速度非常快,但需要保证同步和互斥,否则会发生数据竞争。常见的同步机制有信号量、互斥锁等。
消息传递:线程之间通过发送和接收消息来通信。这种方式比较安全,不会发生数据竞争,但通信速度相对较慢。常见的消息传递机制有管道、队列、信号等。
2. 进程之间通信:
进程之间通信的方式相对比较多,主要包括以下几种:
管道:管道是最早的进程间通信方式之一,它包括匿名管道和命名管道两种。匿名管道只能在具有亲缘关系的进程之间使用,而命名管道则可以在不相关的进程之间使用。
消息队列:消息队列是一种存储在内核中的消息链表,进程可以通过发送和接收消息来进行通信。这种方式比较灵活,可以传递不同类型的数据。
信号量:信号量是一种用于同步的机制,它可以在不同的进程之间传递信号,以控制对共享资源的访问。
共享内存:进程之间可以通过共享内存来直接读写对方的数据。这种方式的速度非常快,但需要保证同步和互斥,否则会发生数据竞争。常见的同步机制有信号量、互斥锁等。
套接字:套接字是一种通用的进程间通信机制,它可以在不同的主机之间进行通信。套接字可以实现多种协议,如TCP、UDP等。
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关
系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。
·程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
·监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
·volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
·传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前。
事务(Transaction)是指一组操作作为单个操作执行的一种方式。这些操作作为一个逻辑单元被执行,要么全部执行成功,要么全部不执行。事务通常用在需要满足一定原子性、一致性、隔离性和持久性的场景,例如在银行转账操作时,必须保证金额的准确性;在购物网站支付时,必须保证钱款支付的原子性等。