
并发编程
Tiffany小仙女
这个作者很懒,什么都没留下…
展开
-
第二章 对象及变量的并发访问
1 怎么解释什么是“线程安全”与“非线程安全”?非线程安全:多个线程对同一对象中的实例变量进行并发访问时发生,会产生“脏读”的后果,也就是取得的数据是被更改的;线程安全:获得的实例变量的值是经过同步处理的,不会出现“脏读”现象2.1.1方法内的变量为线程安全public class HasSelfPrivateNum { private int num = 0; public...原创 2018-09-13 10:45:55 · 106 阅读 · 0 评论 -
happens-before
一JMM的设计在设计JMM的时候,要考虑两个关键因素程序员对内存模型的使用。程序员希望内存模型易于理解,易于编程。 编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越小越好,这样它们可以做尽可能多的优化来提高性能设计JMM时的核心目标是:找到一个好的平衡点,一方面要为程序员提供足够强的内存可见性保证,另一方面对编译器和处理器的限制尽可能放松。JMM把happe...原创 2018-10-09 16:14:48 · 163 阅读 · 0 评论 -
并发编程的艺术——第一章并发编程的挑战
什么是上下文切换?CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片之后会切换到下一个任务,但是在切换前会保存上一个任务的执行状态,以便下次再切换到这个任务的时候,可以再加载这个任务的状态。任务从保存到再加载的过程是一次上下文切换。用并发解决的问题大体可以分为“速度”和“设计可管理性”两种速度:并发通常是提高运行在单处理器上的程序的性能。将程序的所有部分当做是单个任务运...原创 2018-09-30 16:03:18 · 161 阅读 · 0 评论 -
volatile的内存语义 锁的内存语义
一volatile的特性可见性:对一个volatile变量的读,总是能看到对这个volatile变量最后的写入原子性:对任意单个volatile变量的读写具有原子性,但类似于volatile++这种复合操作不具有原子性二volatile写读建立的happens-before关系 从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:volatile写与...原创 2018-10-09 11:22:37 · 178 阅读 · 0 评论 -
第六章单例模式与多线程——立即加载“饿汉模式”与延迟加载“懒汉模式”
立即加载就是使用类的时候已经将对象创建完毕了,也称为“饿汉模式”package test01;public class MyObject {// 创建对象 private static MyObject object = new MyObject(); private MyObject(){ } //用来返回实例对象,因为此方法没有同步,因此出现非线程安全问题 publ...原创 2018-09-27 18:17:19 · 620 阅读 · 0 评论 -
第二节ReentrantReadWriteLock类
读写锁ReentrantReadWriteLock类有两个锁:与读相关的锁称为共享锁,与写相关的锁称为排他锁,多个读锁之间不互斥,但是读锁与写锁互斥,写锁与写锁互斥。多个线程可以同时进行读取操作,但是同一时刻只能允许一个线程进行写入操作 ...原创 2018-09-26 20:07:48 · 117 阅读 · 0 评论 -
并发编程的艺术——第二章Java并发机制的底层实现原理
第一节 volatile的应用定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存后再进行操作在多处理器下, 为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上的传播数据来检查自己缓存的值是不是过期了,当...原创 2018-10-02 14:44:34 · 246 阅读 · 0 评论 -
3.3类ThreadLocal的使用
该类主要解决的是每个线程绑定自己的值3.3.1方法get()和nullpackage test1;public class Run { public static ThreadLocal t1 = new ThreadLocal<>(); public static void main(String[] args) { if(t1.get() == null) {...原创 2018-09-20 10:00:51 · 145 阅读 · 0 评论 -
4.1使用ReentrantLock类
例1:package service;public class Run { public static void main(String[] args) {// 线程打印完毕后将锁进行释放,其他线程才能进行继续打印,线程之间的打印顺序是随机的 MyService service = new MyService(); MyThread a1 = new MyThread(s...原创 2018-09-26 19:14:17 · 125 阅读 · 0 评论 -
第二章 对象及变量的并发访问第三节
volatile关键字的主要作用是使变量在多个线程间可见package exercise;public class Run {//程序停不下来,一直在执行while子句 public static void main(String[] args) { PrintString service = new PrintString(); service.printStringMet...原创 2018-09-14 22:00:51 · 101 阅读 · 0 评论 -
3.2方法join的使用
方法join()的作用是等待线程对象销毁3.2.2用join方法来解决方法join的作用是使所属的线程对象x正常执行run方法的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后在继续执行线程z后面的代码join和synchronized的区别:join在内部使用wait方法进行等待,而synchronized关键字使用的是“对象监视器”的原理作为同步3.2.3方法join...原创 2018-09-19 21:50:24 · 151 阅读 · 0 评论 -
第二章对象及变量的并发访问第二节
同步方法的弊端:如果线程A调用同步方法执行一个长时间的任务,那么线程B则必须等待比较长时间synchronized方法是对当前对象进行加锁,synchronized代码块是对某一对象进行加锁2.2.2synchronized同步代码块的使用当两个并发线程访问同一对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线...原创 2018-09-14 15:39:35 · 111 阅读 · 0 评论 -
双重检查锁定和延迟初始化
在多线程程序中,有时候我们需要采用延迟初始化来降低初始化类和创建对象的开销使用synchronized延迟初始化的弊端:使用synchronized降低性能开销,如果该同步方法被多个线程频繁调用,将会导致程序执行性能的下降使用双重检查锁定来延迟初始化的好处:多个线程试图在同一时间创建对象时,会通过加锁来保证只有一个线程创建对象 在对象创建好之后,执行getInstance()方法...原创 2018-10-10 10:54:15 · 270 阅读 · 0 评论