Java内存模型

​ 在之前的一些有关并发的文章里面,掺杂着各种JMM有关的知识点,在这里加入JVM的内存统一整理一下。

Mehr lesen

线程间通信

​ 我在《同步语义-volatile》一文中提到过共享内存和消息传递线程中的两种通信机制,但是在Java线程中的通信方式存在很多种,在这里整理了一下。

Mehr lesen

双重检查锁和延迟初始化

​ 有幸听一位学长讲过一次关于Java中单例模式与静态成员初始化对比的一个知识点。第一个知识点是在完成一个final域的初始化之前,存在着能够读取值的可能性;第二个知识点是在并发中,对于单例模式的一种可以称作为优化设计的知识。恰巧学到了这些内容的知识点,重新读了一下内容,整理了一下。

Mehr lesen

同步语义-synchronized+final

Java中的锁–synchronized

​ 在并发编程中,synchronized一直是非常重要的角色。通过加锁解锁,让临界区互斥执行,并且释放一个锁的线程向获取同一个锁的线程发送消息。
锁获取过程中做到的线程通信
在上面的示意图中,A线程先进行加锁,然后更新a的值,A释放锁之后,线程A会把a的值刷回到主内存中,当B进行加锁的时候,会从主内存中重新读取数据,此时就拿到了最新的A改变的a的值,也就是在两个线程中间做到了通信。锁的这种通信方式也是JMM所采用的共享内存模型。
在JDK1.6之后,对synchronized的语义进行了优化,让这个锁变的没有那么重量级了。

Mehr lesen

同步语义-volatile

volatile是啥

​ volatile,在Java中保证了线程之间对于共享变量的同步,这里的同步,是指内存可见性,除去保证内存可见性,volatile语义还对JMM对于指令的重排序进行了禁止。

Mehr lesen

内存屏障

内存屏障是个啥?

​ 内存屏障,是计算机CPU在多核时代,通过数据拷贝,将一个处理器的内存状态对其他处理器可见。在百度百科中,内存屏障也被称呼为内存栅栏,内存栅障,屏障指令等。乍一看到内存栅栏这个这个名词,我还以为这个是跟Java栅栏是一个东西,但是实际上两者并不相同。
在执行CPU指令的时候,CPU会对指令进行乱序执行,来优化性能(这一点我在《共享内存模型》一文中有提到过)。而在多线程的时候,乱序执行可能会导致代码的执行跟预期结果不同,内存屏障同时阻止指令排序行为的发生。

Mehr lesen

共享内存模型

共享内存模型

​ 在线程与锁之间,一个非常简单的并发模型是–共享内存模型。共享内存模型是指通过共享内存来实现并发的模型。
共享内存模型中,当多个线程在并发执行过程中对共享资源进行处理时候,如果没有进行一定的同步处理,那么就会出现读脏、数据无效的问题。在共享内存模型中,非常重要的两个概念是:内存可见性+原子性。
Java中多个线程之间的通信就是通过共享变量来进行的,JVM里面主内存是所有内存共享的,而每个线程拥有自己的工作内存,线程只能在自己的工作内存中处理数据。那么很明显的,在内存之间对共享变量处理过程就容易出现错误问题。
内存结构模型

Mehr lesen

检测String的不可变性及String赋值的实质

String实现

​ 从学习Java不久,就有人跟我讲过String是不可变的,也就是新建出来的String对象就不能够进行改变,对其进行改变会新建一个String对象,并且对其进行赋值。阅读了一下String的源码实现,简单的了解了一下机制。

Mehr lesen

Vector自动增加数组容量的实现

​ 昨天在了解到ArrayList的自动扩容之后,忽然想到在Java的另外一个类-Vector里面,实现了数组的自动增长,然后看源码了解了一下。

Mehr lesen

有趣的java.util.*Link

​ 阅读容器的源码,然后读到了一些有意思的东西。

Mehr lesen