volitale、synchronized、RetreenLock区别】的更多相关文章

synchronized和RetreenLock锁区别 1.synchronized是java关键字,RetreenLock是个java类 2.synchronized无法获取锁状态,Lock可以判断是否持有锁 3.synchronized会自动释放锁,Lock需要在finally中unlock()手动释放锁 4.使用synchronized,线程1获取锁,线程2只能等待:使用Lock,线程1获取锁,线程2会尝试获取锁,如果获取不到,不会一直等待,可以直接结束. 5.synchronized不可…
reference to :  http://www.cnblogs.com/shipengzhi/articles/2223100.html 1.synchronized与static synchronized 的区别       synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了.那么static synchronized恰好就是要控制类的所有实例的访问了,stat…
ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区…
volatile和synchronized特点 首先需要理解线程安全的两个方面:执行控制和内存可见. 执行控制的目的是控制代码执行(顺序)及是否可以并发执行. 内存可见控制的是线程执行结果在内存中对其它线程的可见性.根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存. synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块…
Lock 和 synchronized 的区别 Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现: synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生:而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁: Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程…
java线程的内存模型 java的线程内存模型中定义了每个线程都有一份自己的共享变量副本(本地内存),里面存放自己私有的数据,其他线程不能直接访问,而一些共享变量则存在主内存中,供所有线程访问. 上图中,如果线程A和线程B要进行通信,就要经过主内存,比如线程B要获取线程A修改后的共享变量的值,要经过下面两步: (1).线程A修改自己的共享变量副本,并刷新到了主内存中.      (2).线程B读取主内存中被A更新过的共享变量的值,同步到自己的共享变量副本中. 总结:在java内存模型中,共享变量…
AQS同步组件 CountDownLatch(只有一个线程对他进行操作): 主线程必须在启动其它线程后立即调用await()方法.这样主线程的操作就会在这个方法上阻塞,直到其它线程完成各自的任务. Semaphore: 控制某个资源可被同时访问的个数 CyclicBarriar: N个线程相互等待相互等待到某个公共屏障点,然后这一组线程再同时执行. ReentrantLock(类比sycronized:sycronized是通过jvm实现): (可重入锁,可指定公平锁还是非公平锁)(避免线程进入…
ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别.前者…
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程.什么是多线程呢?即就是一个程序中有多个线程在同时执行. 单线程程序:即,若有多个任务只能依次执行.当上一个任务执行结束后,下一个任务开始执行.如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网. 多线程程序:即,若有多个任务可以同时执行.如,去网吧上网,网吧能…
一.指令重排问题 你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排. 1.1 虚拟机层面 我们都知道CPU执行指令的时候,访问内存的速度远慢于 CPU 速度. 为了尽可能减少内存操作带来的 CPU 空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱:即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行. 当然这样的前提是不会产生错误.不管谁先开始,总之后面的代码在一些情况下存在先结束的可能. 1.2 硬件层…