Java并发编程
白玉灬风
一枚小学生
展开
-
Java并发编程之CPU缓存和乱序执行优化
什么是并发: 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个状态。如果运行在多核处理器上,程序中的每个线程都将分配到一个处理器核上,因此可以同时执行。其聚焦点是多个线程操作相同的资源,保证线程安全,合理使用资源。 并发之CPU缓存: 上述左图是最简单的高速缓存的图示...原创 2018-07-28 20:25:11 · 1367 阅读 · 0 评论 -
Java并发编程之不可变对象
不可变对象条件对象需要满足一下三个条件才是不可变对象:1、对象创建以后其状态就不能修改2、对象所有域都是final类型3、对象是正确创建的(对象在创建期间,this引用没有溢出)简而言之就是将类声明为final,将所有的成员声明为私有的,对变量不提供set方法。将所有可变的成员声明为final。在get方法中不返回对象本身,而是克隆对象的拷贝。(可参考String类)。fi...原创 2018-08-16 21:41:04 · 254 阅读 · 0 评论 -
Java并发编程之可见性与有序性
什么是可见性:可见性:一个线程对主内存的修改可以及时的被其他线程观察到。 导致共享变量在线程间不可见的原因:1、线程交叉执行2、重排序结合线程交叉执行3、共享变量更新后的值没有在工作内存与主内存间及时更新 对于可见性,jvm提供了synchronized和volatile关键字。JMM关于sysnchronized的两条规定:一、线程解锁前,必须把共享变量的...原创 2018-08-08 19:34:44 · 1094 阅读 · 0 评论 -
Java并发编程之常见线程不安全类与写法
线程不安全类:一个类的对象可以被多个线程访问修改,并且没有做任何的同步或者并发处理,就很容易出现线程安全问题。以下介绍几种常见的线程不安全类及其写法:一、StringBuilder,StringBuffer字符串拼接主要提供了两个类:StringBuilder,StringBufferStringBuilder字符串拼接测试:@Slf4jpublic class Strin...原创 2018-08-15 22:07:21 · 1030 阅读 · 0 评论 -
Java并发编程之原子性-synchronized关键字
原子性提供了互斥访问,同一个时刻只能有一个线程对其进行操作,Java里能够保持原子性的除了atomic包之外还有锁synchronized关键字:主要依赖jvm来实现锁,在这个关键字的作用对象的作用范围内只能有一个线程来执行操作。Lock:jdk提供的代码层面的锁,依赖特殊的cpu指令,比较有代表性的有ReentrantLock synchronized是一种同步锁,它修饰的对象主...原创 2018-08-07 21:45:27 · 484 阅读 · 0 评论 -
Java并发编程之原子性-Atomic详解
线程安全:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么就称这个类时线程安全的。线程安全主要体现在以下三个方面:原子性:提供了互斥访问,同一时刻只能有一个线程对它进行操作可见性:一个线程对主内存的修改可以及时的被其他线程观察到有序性:一个线程观察其他线程中的指令执行顺...原创 2018-08-07 20:43:11 · 38639 阅读 · 1 评论 -
Java并发编程之工厂模式
饿汉模式:饿汉模式的单例实例是在类装载时进行创建的,它是有JVM的机制保证的,所以它总是线程安全的:/** * 饿汉模式 * 单例实例在类装载时进行创建 */public class SingletonExample2 { // 私有构造函数 private SingletonExample2() { } // 单例对象 privat...原创 2018-08-09 22:29:15 · 1049 阅读 · 0 评论 -
Java并发编程之Java内存模型
为了屏蔽各种硬件和和操作系统内存访问差异,从而实现JAVA程序在各种平台下都能达到一致的并发效果。Java虚拟机规范中定义了java内存模型(JMM)。JMM是一种规范,规范了java虚拟机与计算机内存时如何协调工作的,它规定了一个线程如何和何时可以看到其他线程修改过的共享变量的值以及在必需时如何同步的访问共享变量。 首先,我们需要先明确jvm内存分配的两个概...原创 2018-07-31 22:13:47 · 208 阅读 · 0 评论 -
Java并发编程之对象发布(Publish)和逸出(Escape)
什么是对象发布:使一个对象能够被当前范围之外的代码所使用。示例:@Slf4jpublic class UnsafePublish { private String[] states = {"a", "b", "c"}; public String[] getStates() { return states; } public s...原创 2018-08-09 21:55:19 · 1503 阅读 · 0 评论