同步方法与同步代码块的区别

 

 

在面试中,我们经常遇到的一个问题是,同步方法同步代码块的区别。或者另一种提问方式,在实际开发中,是使用同步代码块好,还是使用同步方法好。

这个考验的是实际上是读者对java同步和锁的理解深刻程度。

结论是很明显的,同步代码块比同步方法好。原因如下:

1、我们只需要对临界区的代码进行同步

因为多线程只会对临界区的代码访问顺序敏感,因此在执行同步操作的时候,如果使用的是同步方法,那么整个方法中的所有内容都会被当做一个原子操作。而事实上在大多数情况下,我们可能只是方法中某一段内容需要同步,同步代码块可以帮助我们只在必要的地方进行同步。

当然,如果方法中的所有内容的确都是要当做一个原子操作进行,那么此时同步代码块和同步方法其实效果是一样的。

2、在同步代码块中,我们可以自由的选择锁

在同步代码块中,我们可以自由的选择任何一个java对象实例作为同步过程中要使用到的锁。但是对于实例同步方法而言,这个锁是不能选择的,就是这个对象实例。对于静态同步方法而言,这个锁就是类的class对象实例。

不能自由的选择锁,就会产生一个很大的问题。例如我们类中定了两个不同的实例同步方法,这两个方法在业务上并没有太多关联。当某个线程在调用其中一个同步实例方法的时候,其他的线程就无法继续调用另外的一个实例同步方法。这是因为,锁只有一个,就是这个类实例对象。必须要等到一个实例同步方法执行完成,把锁释放了之后,其他的线程得到锁,才能执行另外一个同步方法。

因为两个实例同步方法的确没有什么关联,所以我们是希望两个同步方法被同时调用的,只要每个方法中的内容可以原子方式执行即可。但是因为我们使用的是同步方法,而锁只有一个(对象实例),因此没有关联的两个需要同步执行的方法互相产生了影响。

如果我们使用的是同步代码块,那么我们就可以自由的选择做,我们可以定义两个任意对象的实例作为锁,然后在不同的方法内部使用同步代码块,并且各自使用其中一个锁,这样就可以避免多个同步实例方法彼此之间的项目影响。  

 

原文地址:http://www.tianshouzhi.com/api/tutorials/mutithread/284

转载于:https://www.cnblogs.com/findbetterme/p/11347141.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值