Java 并发编程(线程,并发概述,Java 内存模型)(1)

线程基本内容

程序: 静态代码 安装在硬盘上的

进程: 运行中的程序 是操作系统分配内存空间的单位

线程: 线程是进程中的一个最小执行单位, 是cpu调度单位 线程依赖于进程

创建线程

1…线程类 继承 Thread

2.实现 Runnable接口,重写 run( )方法

3.实现 Callable接口 重写 call( )方法 有返回值 可以抛出异常

常用方法

run() call() start()

设置名字

设置优先级

线程状态

start() 就绪状态

join() sleep() 阻塞状态

yield() 线程让步 运行状态 主动让出 —>就绪状态

多线程

程序中如果同时有多个任务执行,需要多线程

多线程可以提高程序运行效率

提高cpu利用率

多线程优点

多线程技术使程序的响应速度更快 ,可以在进行其它工作的同时一直处于活动状态,程序性能得到提升. 性能提升的本质 就是榨取硬件的剩余价值(硬件利用率).

多线程问题 多线程带来的问题是什么?

安全性(访问共享变量),性能(切换开销等)

不足:

对cpu 内存的要求增加了

多线程同时访问同一个共享资源

线程安全问题:

​ 多线程 且 多个线程访问同一个共享数据.

解决办法 排队+锁:

Synchronized: 关键字 修饰方法 修饰一个代码块

​ 是隐式锁 自动加锁 自动释放锁

ReentrantLock:

只能对某段代码加锁 是显示锁 手动添加 手动释放
守护线程

死锁

线程通信

wait() notify()

sleep() 休眠指定的时间 时间到了后,会进入到就绪状态 不会释放锁

wait() 让线程等待 必须需要通过notify()唤醒 等待时会释放锁

并发编程概述

单核 cpu 下,线程实际是串行执行的。操作系统中有一个组件叫做任务调 度器,将 cpu 的时间片,分给不同的线程使用,只是由于 cpu 在线程间(时间片 很短)的切换非常快,人类感觉是同时运行的。

总结为一句话就是:

微观串行,宏观并行,一般会将这种线程轮流使用 cpu 的做法称为并发,concurrent.

多核 cpu 下,每个核(core)都可以调度运行线程,这时候线程可以是并行的。

并发编程是什么?

并发: 是在某一个时间段内 依次做好几件事情 一个一个的做 多个线程访问同一个资源

​ 单核cpu不会出现问题

​ 硬件cpu的功能逐渐强大, 已经发展到多内核( 4 8 12) 可以同时执行多个线程 这样就有可能多个线程同时执行,同时访问同一个共享数据 . 秒杀 抢购…

​ 并发编程就是要让在多核,多线程情况下,也只能一次只有一个线程对共享数据进行访问.

​ 我们现在已经可以通过加锁的方式实现, 但是加锁并不是唯一的解决方案,还有其他方式来实现.

​ 多核cpu可以做到真正的并行执行,但是我们在某种场景,就是要让程序并发执行.

并行: 在一个时间节点,可以同时做多件事

(概述:
并发说的是在一个时间段内,多件事情在这个时间段内交替执行。
并行说的是多件事情在同一个时刻同事发生。)

Java 内存模型(JMM)

注意 是java内存模型(JMM) ,不是 JVM模型

问题

硬件的发展中,一直存在一个矛盾,CPU、内存、I/O 设备的速度差异;

速度排序:CPU > 内存 > I/O 设备

为了平衡这三者的速度差异,做了如下优化:
CPU 增加了缓存,以均衡内存与 CPU 的速度差异;
操作系统以线程分时复用 CPU,进而均衡 I/O 设备与 CPU 的速度差异;
编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。

JMM

Java 内存模型(Java Memory Model,JMM)规范了 Java 虚拟机与计算机内存是如何协同工作的。Java 虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为 Java 内存模型。

Java 内存模型,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现 让 Java 程序在各种平台下都能达到一致的并发效果,JMM 规范了 Java 虚拟机 与计算机内存是如何协同工作,规定了一个线程如何以及何时可以看到由其他线 程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。

计算机在高速的 CPU 和相对低速的存储设备之间使用高速缓存,作为内存 和处理器之间的缓冲。将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。

在多处理器的系统中(或者单处理器多核的系统),每个处理器内核都有自己 的高速缓存,它们有共享同一主内存(Main Memory)。 当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

JVM 主内存与工作内存

Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机 中将变量(线程共享的变量)存储到内存和从内存中取出变量这样底层细节。

Java 内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工 作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内 存中的变量。

这里的工作内存是 JMM 的一个抽象概念,也叫本地内存,其存储了该线程以 读 / 写共享变量的副本。

就像每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存.

就像每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存

不同线程之间无法直接访问对方工作内存中的变量,线程间的通信一般有两种方 式进行,一是通过消息传递,二是共享内存。Java 线程间的通信采用的是共享内存方式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值