java 代码块锁_Java同步代码块锁的对象有条件吗?

最近就在折腾和锁相关的东西:

首先呢,作为锁的对象,我们最好定义为final,因为这样对象就不会发生变化,因此最终锁会只有一个,不同线程竞争一个锁,就可以达成同步效果了。

针对不同情况,锁也应该相应进行调整,这具体和线程影响的范围有关系,只需要通过锁限制会有多线程问题的部分即可,例如我们有多个地区的店一起卖票,当然,不同地区的票就没有线程问题,因此我们可以使用多个对象作为锁,分别锁定各个地区,这样既能够保证执行效率,又能达到同步的目的。

这里的ticket,他是一个包装类型,既可以作为数值直接运算,也可以作为Object调用各类方法,在java处理的时候,会自动变成基本类型,这个过程叫做自动拆箱,而当我们对包装类型直接使用数值赋值的时候,java会自动转换他为包装类型,这个过程叫做自动装箱。

这样做的目的是因为java是面向对象的,一旦基本类型装箱,就会成为引用类型,同时具有引用类型的所有性质,这样你就能够使用这个类型的各种方法了,而基本类型你是无法使用他的方法的。

当然同时这种包装类型也是特殊的,他同样具有基本类型的特点,例如可以直接进行运算等。

关于这个对象,到底是一个新对象还是固定的对象,我本身不是很了解,不过看其他答主已经验证了这个问题了,他的确是一个新对象。

同时呢,Java的锁并不止一个synchronize关键字,他提供了很多其他的锁,你同样可以通过这锁来完成同步的工作。

另外关于字符串,字符串其实是一个常量,直接锁定某个字符串的话,通常情况下是能够进行同步的,如果通过new创建的字符串,那将会是一个新的对象,即使你new了内容相同的字符串,那也是两个,而直接双引号,那就是常量了。

其实这里你可以直接private static final Object locker = new Object();

然后通过locker这个量进行同步即可。


版权声明:本文为weixin_42458217原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。