多线程
rap_libai
这个作者很懒,什么都没留下…
展开
-
volatile和synchronized
1.使用上的区别 volatile关键字只能用于修饰实例变量或者类变量,不能用于修饰方法以及方法参数和局部变量、常量等。 synchronized关键字不能用于对变量的修饰,只能用于修饰方法或者语句块。 volatile修饰的变量可以为null,synchronized关键字同步语句块的monitor对象不能为null。2.对原子性的保证volatile无法保证原子性...原创 2018-09-09 22:05:04 · 200 阅读 · 0 评论 -
LOCK;内存屏障
确保指令重排序时不会将其后面的代码排到内存屏障之前。 确保指令重排序时不会将其后面的代码排到内存屏障之后。 确保在执行到内存屏障修饰的指令时前面的代码全部执行完成。 强制将线程工作内存中值的修改刷新到主内存中。 如果是写操作,则会导致其他线程工作内存(CPU Cache)中的缓存数据失效。...原创 2018-09-09 21:38:34 · 963 阅读 · 1 评论 -
类的主动使用和被动使用
JVM规范了以下6种主动使用类的场景:1.通过new关键字会导致类的初始化:这种是大家经常采用的初始化一个类的方式,它肯定会导致类的加载并且最终初始化。2.访问类的静态变量,包括读取和更新会导致类的初始化,这种情况的示例代码如下public class Simple{ static{ System.out.println("I will be initiali...原创 2018-09-08 17:44:21 · 1110 阅读 · 0 评论 -
happens-before原则
1.程序次序规则:在一个线程内,代码按照编写时的次序执行,编写在后面的操作发生于编写在前面的操作之后。 这句话看起来是程序按照编写的顺序来执行,但是虚拟机还是可能对程序代码的指令重排序,只要保证一个线程内最终的结果和代码顺序执行的结果一致即可。2.锁定原则:一个unlock操作要先行发生于对同一个锁的lock操作。 无论是单线程还是多线程的环境下,如果同一个锁是锁定状态,那必...原创 2018-09-08 17:27:04 · 1135 阅读 · 0 评论 -
java线程同步synchronized与lock
一、synchronized关键字 public synchronized void method(){ method body}二、ReentrantLock类在jdk1.5以后有了java.util.concurrent包,里面提供了lock方法 private Lock lock1 = new ReentrantLock();public void m...原创 2017-11-15 21:25:46 · 217 阅读 · 0 评论 -
Double-Check实现单例模式
Double-Check提供了一种高效的数据同步策略,那就是首次初始化时加锁,之后则允许多个线程同时执行getInstance方法的调用来获得类的实例。示例代码如下:public final class Singleton { private static Singleton instance = null; private Singleton() { } ...原创 2018-09-10 19:31:18 · 1196 阅读 · 0 评论