并发基础

本文深入探讨了并发编程的核心问题,包括线程间通信和同步,对比了Java和Go语言的内存模型。Java采用共享内存模型,线程间通信隐式进行,而Go语言则通过channel实现线程间通信,强调不要通过共享内存通信,而应通过通信共享内存的理念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存模型

内存模型属于编程语言层次规范

内存模型是在谈论并发相关事宜

线程是并发的基础设施,内存模型是编程语言给的规范,给并发编程提供的一种便利手段。

 

多线程编程的核心问题

线程间通信和线程间同步

 

共享内存

 共享内存是线程或进程间通信的方式之一,就是共享数据,使用共享内存的话在多线程的场景下为了处理竞态,需要加锁,使用起来比较麻烦。go语言中并发就使用了不同的模型,go语言的channel保证同一个时间只有一个goroutine能够访问里面的数据,为开发者提供了一种优雅简单的工具,所以go原生的做法就是使用channle来通信,而不是使用共享内存来通信。go提倡“不要通过共享内存来通信,而应该通过通信来共享内存”。

Java采用的是共享内存模型,在共享内存模型中,线程间通信是隐式的,线程间同步是显式的。必须理解这个隐式。Java内存模型的抽象结构.

 

可执行程序在操作系统中内存布局是文本段、数据段、bss段、堆、栈(内存地址由低到高),说明Java虚拟机运行时在内存中也是这样的布局。那Java运行时数据区有方法区、虚拟机栈、本地方法栈、程序计数器、堆五个区域,这两者是没有什么关系的,Java虚拟机的布局都是建立在进程空间的堆上的。

 

线程

线程是操作系统层次的概念和功能,Java中的线成时和操作系统原生线成一一对应的,你在Java中使用的线程代表着一个真正操作系统原生线程,但是不是真正的原生线程。

缓存和缓冲

高速缓存是一个第三方的存储部件,加快了存储速度。缓冲是说数据填满一定大小后再处理,可以减少内核状态频繁转换以及避免速度不等设备之间等待,加快了交互速度。

 

为什么Java对现象基类Object中包含并发相关的方法wait()、notify()?

因为早期Java并发设计时是用synchronized关键字来实现并发大多数功能,synchronized的哲学就是隐式使用锁,让锁自动关联到方法和代码段,这样势必使锁和对象关联了起来,所以就将部分并发相关的方法直接作为所有对象的基础,同时需要注意,notify(),wait()必须在加锁代码内部,否则会抛出异常,这更加说明了他早期就是配合synchronized设计和使用的。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值