线程进程的通信

线程通信

线程是cpu调度的基本单位,进程是资源分配的基本单位,一个进程有多个线程。线程之间怎样通信?

volatile

对线程通信,主要是保证修改对其他线程可见。而volatile能够保证修饰的变量对其他线程可见,防止指令重排序。跟多的信息请观看https://blog.csdn.net/tangjingui/article/details/107064235

sychornized

不管是sychornized还是ReentranLock都能保证多线程环境下,和单线程执行结果一样,但他们的原理是不一样的,sychronied是在退出sychornied块之前刷新会JMM主内存,这就能保证块内的内容对其他线程可见。

wait/notify机制

等待唤醒机制同样能够,能够保证wait和唤醒之间的代码能够按单线程执行,这样也能够保证线程通信。

ThreadLocal

这个不建议使用:会造成内存泄漏。

ThreadLocal实现原理

首先,每个线程内部有一个ThreadLocal.ThreadLocalMap 成员变量,这个ThreadLocalMap是一个ThreadLocal的静态内部类,

而线程的本身并不会操作这个变量,都是ThreadLocal来操作这个变量,一般而言,都是通过当前线程来获取Map,然后进行操作。

ThreadLocalMap是ThreadLocal的内部类,他并没有继承Map相关接口,通过Entry(ThreadLocalMap的内部类,继承WeakReference,只有一个成员变量Object value 初始化是(key,value)其中super(key))他解决hash冲突的方式就是线程,不是链表。默认数组大小为16,阀值为长度的2/3,扩容长度为2倍。

造成内存泄漏的原因,由于Entry的key是弱引用类型,在GC遇到就会回收,这样就会造成key失效,value还在内存中,泄漏了,

所以,尽量的在set,get之后通过remove方法移除。

线程join方法

当然这种方式是有很大局限的。

进程的通信方式

管道

管道是一种半双工的通信方式,意思同一时间,有固定的读端和写端。传输效率慢。

只能用于有关系的进程通信,比如父子进程,兄弟进程

命名管道

可以是无关进程通信方式,FIFO

信号量

这个主要用于pv操作,不能传递复杂的信息,一般和共享内存配合使用

共享内存

这个是最快的进程通信,通常配合信号量一起使用,信号量控制进程互斥同步,所有的进程通过使用一块内存来传递消息

Liunx套接字

这是liunx系统的同一台主机上的进程通信,这种传输没有流量控制,拥塞控制,报文重传机制,速度快。

套接字

这也是众所周知的Socket,不同主机进程之间的通信方式。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值