Java并发体系-第三阶段-JUC并发包-[1](转载)
AtomicXXXFieldUpdater
算是一个小补充
简介public class AtomicIntegerFieldUpdaterTest {
public static void main(String[] args) {
AtomicIntegerFieldUpdater<Test> updater = AtomicIntegerFieldUpdater.newUpdater(Test.class, "value");
Test ts = new Test();
IntStream.rangeClosed(0, 2).forEach(item -> {
new Thread(() -> {
int value = updater.getAndIncrement(ts);
System.out.println("oldV: " + value);
}).star ...
Java并发体系-第二阶段-锁与同步-[3](转载)
synchronized保证三大特性synchronized保证原子性的原理
对num++;增加同步代码块后,保证同一时间只有一个线程操作num++;。就不会出现安全问题。
synchronized保证可见性的原理
synchronized保证可见性的原理,执行synchronized时,会对应lock原子操作会刷新工作内存中共享变 量的值。
synchronized保证有序性的原理
我们加synchronized后,依然会发生重排序,只不过我们有同步 代码块,可以保证只有一个线程执行同步代码中的代码。保证有序性。
synchronized的特性可重入特性意思就是一个线程可以多次执行synchronized,重复获取同一把锁。
/*
目标:演示synchronized可重入
1.自定义一个线程类
2.在线程类的run方法中使用嵌套的同步代码块
3.使用两个线程来执行
*/
public class Demo01 {
public static void main(String[] args) {
new ...
Java并发体系-第二阶段-锁与同步-[2](转载)
可见性设计的硬件
从硬件的级别来考虑一下可见性的问题
1、第一个可见性的场景:每个处理器都有自己的寄存器(register),所以多个处理器各自运行一个线程的时候,可能导致某个变量给放到寄存器里去,接着就会导致各个线程没法看到其他处理器寄存器里的变量的值修改了,就有可能在寄存器的级别,导致变量副本的更新,无法让其他处理器看到。
2、第二个可见性的场景:然后一个处理器运行的线程对变量的写操作都是针对写缓冲来的(store buffer)并不是直接更新主内存,所以很可能导致一个线程更新了变量,但是仅仅是在写缓冲区里罢了,没有更新到主内存里去。这个时候,其他处理器的线程是没法读到他的写缓冲区的变量值的,所以此时就是会有可见性的问题。
3、第三个可见性的场景:然后即使这个时候一个处理器的线程更新了写缓冲区之后,将更新同步到了自己的高速缓存里(cache,或者是主内存),然后还把这个更新通知给了其他的处理器,但是其他处理器可能就是把这个更新放到无效队列里去,没有更新他的高速缓存。此时其他处理器的线程从高速缓存里读数据的时候,读到的还是过时的旧值。【处理器是优先从自己的高速缓存里取读取变量副本】 ...
Java并发体系-第二阶段-锁与同步-[1](转载)
本阶段文章讲的略微深入,一些基础性问题不会讲解,如有基础性问题不懂,可自行查看我前面的文章,或者自行学习。
本篇文章比较适合校招和社招的面试,笔者在2020年面试的过程中,也确实被问到了下面的一些问题。
并发编程中的三个问题
由于这个东西,和这篇文章比较配。所以虽然在第一阶段写过了,这里再回顾一遍。
可见性可见性概念可见性(Visibility):是指一个线程对共享变量进行修改,另一个线程立即得到修改后的新值。
可见性演示/* 笔记
* 1.当没有加Volatile的时候,while循环会一直在里面循环转圈
* 2.当加了之后Volatile,由于可见性,一旦num改了之后,就会通知其他线程
* 3.还有注意不能用if,if不会重新拉回来再判断一次。(也叫做虚假唤醒)
* 4.案例演示:一个线程对共享变量的修改,另一个线程不能立即得到新值
* */
public class Video04_01 {
public static void main(String[] args) {
MyData myData = new MyData();
...
Java并发体系-第一阶段-多线程基础知识(转载)
程序、进程、线程的理解1、程序(programm)概念:是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码。
2、进程(process)概念:程序的一次执行过程,或是正在运行的一个程序。说明:进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
3、线程(thread)概念:进程可进一步细化为线程,是一个程序内部的一条执行路径。说明:线程作为CPU调度和执行的单位,每个线程拥独立的运行栈和程序计数器(pc),线程切换的开销小。
补充:
进程可以细化为多个线程。每个线程,拥有自己独立的:栈、程序计数器多个线程,共享同一个进程中的结构:方法区、堆。
并行与并发单核CPU与多核CPU的理解
单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过,那么CPU就好比收费人员。如果某个人不想交钱,那么收费人员可以把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费。)但是因为CPU时间单元特别短,因此感觉不出来。
如果是多核的话,才能更好的发挥多线程的效率。(现 ...