synchronized和volatile

1、关于synchronized的

synchronized是Java中的关键字,用来给某个对象加锁的,在程序运行到被锁住的代码部分时,必须获取该对象才能继续执行。

synchronized可以锁住方法体中的代码部分,这时锁对象可以是外置对象,可以是调用者本身(this);当synchronized在方法声明上,有两种情况:该方法是非静态的,此时锁对象为调用者本身(this);该方法是静态的,锁对象是类本身(packageName.ClassName.class),并且在方法中不能使用this作为锁对象。

底层实现:

执行monitorenter(监视器),将计数器+1,;释放monitorenter(监视器),将计数器-1;

当线程判断到计数器为0时,表示当前锁空闲,可以占用;反之线程进入等待

2、关于volatile的

被该关键字修饰的变量可以在多个线程间共用,在一个线程中修改了该变量后,会迫使其它线程重新读取该值,只保证可见性,不保证原子性(就是在多线程同时修改,会出现并发问题)

实现:在多个线程在各自的工作内存中维护了一个被volatile修饰的变量后,当其中某个线程将该值改变,会强制将该变量的值在主内存修改;修改完之后,会将其它线程工作内存中的该值设置过期;这样,在其它线程读取该值时,会被强制重新从主内存中读取该变量的值。

扩展:volatile主要作用保证可见性以及有序性,有序性设计复杂的指令重排、内存屏障等概念

3、volatile与synchronized之间的区别

(1)volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其它线程被阻塞

(2)volatile只能用在变量上

     synchronized可以在变量、方法上使用

(3)volatile可以保证可见性

     synchronized可以保证可见性和原子性

(4)volatile不会造成线程阻塞

 synchronized会造成线程阻塞

(5)当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1、n++等

     如果某个域的值收到其它域的值得限制,volatile无法工作,如Range的lower<=upper的限制

(6)使用volatile而不是synchronized的唯一安全的情况是类中只要一个可变的域

(7)volatile效率远比synchronized高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值