synchronized关键字与Lock锁机制的区别问题
在本人学习Java的过程中,遇到了很多形形色色的问题。当时琢磨了好久才琢磨出这样的总结,贴出来供大家参考参考。以下观点仅代表本人在学习过程中的观点,望大家能够共同讨论,查漏补缺。
在我之前的帖子中,提过关于线程同步安全的操作。我的做法是使用synchronized关键字或者是synchronized方法,又或者是使用Lock同步锁机制来进行线程同步安全的操作。
那么现在问题就来了,synchronized关键字跟我们的Lock同步锁机制又有什么区别呢?下面我将列出他们的区别:
1、
同步代码块其实自身是具有自动上锁、自动解锁功能的
Lock锁机制则是手动解锁,手动上锁的
2、
用synchronized修饰的同步代码块还有同步方法是有同步锁对象的
Lock锁机制是没有同步锁对象的
3、
因为synchronized修饰的同步代码块还有同步方法是具有锁对象的,因此,可以
调用notify()、wait()、notifyAll()的方法
但是因为Lock锁机制是不具有锁对象的,因此是不可以去调用notify()、wait()、
notifyAll()方法的,否则会发生报错
那么如果Lock锁机制一定要使用等待唤醒机制的话,在Java5之后,我们只能通过创建一个Condition类对象,然后通过该对象来调用await()、signal()、signAll()方法,而这几个方法的作用跟notify()、wait()、notifyAll()是一样功能的
同时,我们需要注意的是,synchronized代码块、方法,其实自身是具有同步锁的,而这个同步锁,对于代码块而言,就是这个代码块所属的那个那个方法的对应的那个对象,对于方法而言,就是调用这个同步方法的那个对象
另外,我们要注意的是:
在同步代码块中,同步锁就是这个代码块所属的那个对象
在同步方法中(非静态),同步锁就是调用这个方法的那个对象
在同步方法中(静态),同步锁就是这个方法所属的这个类的字节码文件,即 类名.class;