在Java这玩意儿里头的关键字, 它可是拿来做那个线程同步事儿的基本法子, 而且它还提供了不少个那种挺灵活的方式来给东西加锁, 就是为了保证在这个有好几个线程一起跑的环境里头, 数据能够保持一致的, 还有就是操作也能够是安全的。
下面是关于它那些主要的加锁方式的一个简单的说明, 这都是我重新组织了一下弄出来又稍微润色过了的, 目的是想让这个文章有点原创的意思的, 您就看看吧呃。
1. 实例方法加锁
把这个东西用到实例方法上面的时候, 那个锁, 它就会自动地去作用在你调用了这个方法的实例对象的身上。这就说明了在某一个时间点上边, 能够访问到这个实例的方法的线程, 只有一个。这样就阻止了其他的线程到这个实例上面去并发地访问。
2. 静态方法加锁
如果, 修饰符是应用在了那个叫作静态方法的东西上面的话, 锁这个东西就会去针对这个方法所属的那个类的对象发生作用, 这个类对象在编程语言里还有一个名字叫做Class类型的那种对象, 而不会去针对那些单个的实例化的对象产生作用。
这其中的含义就是, 不管这个世界上存在多少个属于同一个类的具体实例存在, 这些所有的实例在进行访问那个特定的静态方法的操作的时候, 都需要一个接一个地按照顺序去执行, 也就是我们常说的串行执行的这种方式。这样的安排和做法, 最终所达成的效果是, 确保了在整个类的层面上能够实现同步控制。
3. 代码块加锁
使用代码块的方法, 是可以使得锁定的范围被更加精细地控制住的, 这一点是通过提供一个作为“锁”的对象给当参数来完成的。这个做法是允许开发者去锁定某个特定的对象, 或者说是锁定一个特定对象之中的某一部分内容的, 而不是说要锁定整个方法的存在的,这样做是提高并发性能的一个手段的。
举个例子来说的话, 就是你可以去锁定一个共享资源的存在的, 或者是去锁定一个特定的锁对象的存在的, 那么这样做的结果是不会影响其他的那些没有被锁定起来的代码的执行过程的。
这里要对加锁的方式进行具体的分析, 同时也需要把适用的场景给讲明白, 并且还要说明一下它的特点。
实例方法加锁
这个操作需要对每个实例进行独立同步。
将属性锁定在该实例对象的上面, 这样就不会影响到属于同一类之中的其他任何实例对相同方法的调用情况。
对静态方法实施加锁处理。
类级别数据的同步操作
把它锁定在类对象上面, 这样就会影响到所有的实例对这个静态方法的访问情况。
代码块加锁
实现控制上的精细化同步, 从而做到对资源的灵活锁定。
你可以自己来决定哪些东西需要被锁住, 这样的锁定程度变得更加细致, 从而使得并发执行的效率得到了提高。
结论
Java里的那些东西, 靠上面说的三种加锁的方法, 给写代码的人提供了一些能力, 这种能力能把并发控制做得从粗的地方到细的地方都有。这样的话, 就满足了各种不同的情况下去保证线程是安全的这个需求。
怎么选择加锁的方式是一个非常重要的事情, 因为这个事儿直接关系到程序运行的时候并发性会变好变坏, 还有程序的运行结果对不对。所以, 写代码的人要根据他们实际要去用的那个场景的具体特点, 还有对性能的要求是怎么样的, 来决定到底用哪种加锁的策略才行呢。