synchronized 与 volatile的区别以及用处

1.synchronized关键字用于方法及代码块,而volatile关键词用于修饰变量。

 

2.在多线程环境下运行时,volatile修饰的变量将不会在线程堆区进行缓存,而是直接写入到‘主存’,所有对volatile修饰变量的修改,都将直接修改“主存”中的值。所以volatile关键字能保证数据的一致性,但却不能解决并发所带来的竞态竞争等问题。

 

3.synchronized关键字将获取对象的锁,当且仅当多个线程同时尝试获取同一个锁时,线程才有可能被阻塞(比如该锁正被别的线程持有)。所以锁对象(synchronized(obj){}中的obj)是可以与当前对象解耦的,所有希望同步代码块只要同时被同一个锁保护,那这些代码块之间就是互斥的(但若在拥有该锁的情况下,再次请求被该锁“锁住”的代码时,不需要重新申请锁及可执行--可重入),而与obj具体是什么对象无关。被synchronized的修饰的方法的锁对象默认为当前对象(方法调用者,this)。

 

4.synchronized获得并释放监视器(monitor)——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事 实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值