![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程艺术
文章平均质量分 81
厚积薄发,积少成多
这个作者很懒,什么都没留下…
展开
-
线程间通信
1、synchronized关键字实现原理:方法块是通过monitorentry和monitorexit去控制,而同步方法则 是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的,两个方式都是通过获取对象的监控器实现,同时这种情况是排他的,也就是说同一个时间只能有一个线程获取对象扽监控器2、监控器,对象,同步队列和执行线程的关系线程进入同步队列,线程状态变为BLOCKED。当访问Object 的前驱(获得了锁的线程)释放了锁,则该释放操作唤醒阻塞在同步队列中的线程,使其重新.原创 2021-03-02 20:33:19 · 135 阅读 · 0 评论 -
2021-02-25线程启动和终止
1、启动线程线程对象在初始化完成之后,调用start()方法就可以启动这个线程。线程start()方法的含义 是:当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用 start()方法的线程。注意 启动一个线程前,最好为这个线程设置线程名称,因为这样在使用jstack分析程 序或者进行问题排查时,就会给开发人员提供一些提示,自定义的线程最好能够起个名字。2、中断线程中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行 了中断操作。原创 2021-02-25 20:45:49 · 313 阅读 · 0 评论 -
线程介绍1.线程是啥 2、为啥使用多线程 3、线程优先级 4、线程状态 5、守护线程Daemon线程
1.线程是啥现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作 系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局 部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉 到这些线程在同时执行。[4] Signal Dispatcher // 分发处理发送给JVM信号的线程[3] Finalizer原创 2021-02-25 16:21:30 · 150 阅读 · 1 评论 -
JMM内存模型综述
1.处理器的内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会以顺 序一致性内存模型为参照。在设计时,JMM和处理器内存模型会对顺序一致性模型做一些放 松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优 化都要被禁止,这对执行性能将会有很大的影响。JMM为程序员屏蔽了不同处理器的差异,2 各种内存模型之间的关系JMM是一个语言级的内存模型,处理器内存模型是硬件级的内存模型,顺序一致性内存 模型是一个理论参考模..原创 2021-02-24 23:05:42 · 122 阅读 · 1 评论 -
loadAnd store
作者:进击的码农链接:https://www.zhihu.com/question/325469611/answer/694336275来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。JVM内存模型的定义八种原子操作八种原子操作下的规则通过以上来定义了JVM的内存模型,也就是我们要遵守的协议八种原子操作分别为1.lock 锁定 : 把主内存中的一个变量标志为一个线程独享的状态2.unlock 解锁 : 把主内存中的一个变量释放出来3.r.转载 2021-02-23 23:27:24 · 538 阅读 · 0 评论 -
双重检测锁和延迟初始化基于类初始化的解决方案
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双 重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的 错误根源,以及两种线程安全的延迟初始化方案。1.问题根源:第7步可能拆分为memory = allocate(); // 1:分配对象的内存空间ctorInstance(memory); // 2:初始化对象instance = memory; // 3:设置instance指向刚分配的内存地上面的为代码可能会在2 和原创 2021-02-23 23:18:01 · 291 阅读 · 4 评论 -
happen-before定义,规则、
happen-before 是JMM的核心概念,我们追求的是啥·程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。·编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越 好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模 型。由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个 好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译原创 2021-02-19 20:47:55 · 202 阅读 · 0 评论 -
final内存语义
1、final的重排规则:对于final域,处理器和编译器遵循两个规则,1、在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用 变量,这两个操作之间不能重排序。2、首次读有final域的对象引用和随后初次读这个final域,这两个操作之间不能 重排序。2、写final域的重排规则:1、JMM禁止将final域重排到构造函数外面2、编译器会在final域的写之后,构造函数return之前,插入一个StoreStore屏障。这个屏障 禁止处理器把fina原创 2021-02-19 19:02:01 · 239 阅读 · 0 评论 -
锁的内存含义
1.锁释放和获取建立的happens-before关系:锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 下面是锁释放-获取的示例代码。class MonitorExample { int a = 0; public synchronized void writer() { // 1 a++; // 2} // 3 public synchronized void reader() {// 4原创 2021-02-19 15:54:39 · 203 阅读 · 0 评论 -
volatile语义级别分析
https://www.cnblogs.com/keeya/p/9255136.html1。可见行2、对变量的读写操作保证原子性,但是不能保证i++这类的操作因为这是三个操作也叫复合操作,这里里面包括了读取值 修改,写回到主内存。可能在前面读的时候拿到了最新的,但是可能其他线程在这个线程修改操作前,进行了修改然后相当于两个线程进行了相同的操作。volatile读写建立的的happeds-before关系: java5也就是JSR-133以后volatile修饰的可以进行线程间通信,...原创 2021-02-18 14:55:54 · 194 阅读 · 0 评论 -
原子类的实现 原理
1.基础概念2.处理器如何实现原子性首先处理器本身就通过对一个字节只能被一个处理器处理,其他处理器不能访问这个原子的内存地址,但是复杂的内存操作处理器是不能自动保证其原子性的,比如跨总线宽度、跨多个缓存行和跨页表的访问但是我们可以通过以下两种方式来保证复杂原子操作1.锁住总线我们就需要锁住总线,来保证i++每次数据都是+1而不是两个cpu之间可能出现从个自缓冲中拿出来值去做对比,然后本来就是要为3但是变成了2.因可能是多个处理器同时从各自的缓存中读取变量i,分别进行加1操作...原创 2021-02-04 15:09:46 · 616 阅读 · 0 评论 -
JMM顺序一致性,1.数据竞争和数据一致性2.顺序一致性3,同步程序的顺序一致性效果。4.未同步的程序特性
定义:顺序一致性是一种内存模型的理论参考模型,也就是他并不是实际存在的,处理器的内存模型和编程语言都会以它为参照。一、数据竞争和顺序一致性原创 2021-02-03 21:05:51 · 336 阅读 · 5 评论 -
JMM内存模型重排序1、重排序 2.as-if-serial语义 3.程序顺序规则
一、重排原因:为了提升代码的运行效率,所以编译器和处理器会对代码的执行顺序进行重新排序,但是有单处理器上和单线程上的数据依赖的一定不会重新排序,但是不同处理器和不同线程上的不考虑二、as-if-serial :as-if-serial的意思就是,无论如何重排,单线程都不会改变最终的执行结果如何做到:为了as-if-serial的实现,所以对有数据依赖的数据不进行重排,因为这种重排会改变结果。但是如果不存在数据依赖,那么就可能会被重排。如下图A和B直接没有数据依赖所以他们顺序改原创 2021-01-21 10:24:00 · 324 阅读 · 0 评论 -
JMM java内存模型 1.并发的关键,2.jmm内存模型,3.指令重排 4、happens-before
一.并发编程的两个关键性问题1.1线程通信通信是指线程间通过何种机制进行信息交换,在命令式编程中有两种方式,共享内存和信息传递共享内存:共享内存通信是指线程间有公共的状态,通过对内存中公共状态的写-读达到通信的目的,这种方式是隐式的通信。消息投递:消息投递的模式,没有共享内存的共同状态,所以线程间需要通过发送消息进行显式的通信。1.2线程同步(这里的线程是指并发执行的活动实体)同步是指不同线程间操作发生相对顺序的机制,在通信内存共享模式下,同步是显示进行的,程序员必须显式的对某个方法原创 2021-01-19 20:59:58 · 120 阅读 · 0 评论