摘要: 重排序 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 阅读全文
posted @ 2019-06-14 16:00 Chris,Cai 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 1,可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。 在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修 阅读全文
posted @ 2019-06-14 15:05 Chris,Cai 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 原子性、可见性、有序性 什么是原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能 阅读全文
posted @ 2019-06-14 14:36 Chris,Cai 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 1,Java 线程之间的通信由Java 内存模型(JMM)控制。JMM决定一个线程对共享变量的写入时,能对另一个线程可见。 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存(main memory)中, 每个线程都有一个私有的本地内存(local memor 阅读全文
posted @ 2019-06-14 14:28 Chris,Cai 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 1,ThreadLocal 不是“本地线程”的意思,而是Thread 的局部变量。每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本 2,提供的接口方法 • void set(Object value)设置当前线程的线程局部变量的值。 • 阅读全文
posted @ 2019-06-14 13:49 Chris,Cai 阅读(180) 评论(0) 推荐(0) 编辑