进程通信原理 & 线程通信原理

进程通信原理:

一、

1、管道(pipe)

半双工通信,数据只能单向流动。

只能在具有亲缘关系的进程间使用。

 

2、流管道

可以双向传输,也只能在具有亲缘关系的进程间使用。

 

3、命名管道

允许双向传输,也能在无亲缘关系的进程间使用。

 

二、信号(signal)

用于通知接受进程有某种事情发生

 

三、消息队列

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

 

四、共享内存

映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多少个进程都可以访问。

 

五、信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正访问共享资源时,其他进程也访问该进程。

 

 

线程通信原理:

一、使用volatile关键字

基于volatile关键字来实现线程间互相通信是使用共享内存的思想,多个线程监听一个变量

二、使用Object类的wait()和notify()方法

Object类提供了线程间通信的方法:wait() 、notify() 、notifyAll() 他们是多线程的基础;

wait() 和notify必须配合sychronized使用, wait方法释放锁,但是notify()方法不释放锁

三、使用JUC(java.util.current包)下的工具类 CountDownLatch

static CountDownLatch coutDownLatch = new CountDownLatch(3);

countDownLatch.await()   线程1,当线程2、3、4 三次时,线程1就进行阻塞

countDownLatch.countDown()  线程2,利用countDown来对数字进行减一,所有await的线程都被唤醒

countDownLatch.countDown()  线程3

countDownLatch.countDown()  线程4

调用await()方法会利用AQS进行排队,一旦数字被减为0,则会将AQS中排队的线程依次唤醒

Semaphore表示信号量,可以设置许可的个数,表示同时允最多多少个线程使用该信号量,通过acquire()来获取许可,如果获取不到,也用AQS来排队,可以通过realease()方法来释放许可,当某个线程释放了许可后,会从AQS中正在排队的第一个线程开次唤醒,直到没有空闲许可。

 

posted @ 2021-09-08 22:04  6000a  阅读(276)  评论(0)    收藏  举报