synchronized与lock怎么选

syschronized和lock有什么区别?

syschronized和lock有什么区别?

1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;
2)Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
区别: 1.用法不一样。synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象。而Lock需要显示地指定起始位置和终止位置。synchronzied是托管给jvm执行的,Lock锁定是通过代码实现的。 2.在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。 3.锁的机制不一样。synchronized获得锁和释放的方式都是在块结构中,而且是自动释放锁。而Lock则需要开发人员手动去释放,并且必须在finally块中释放,否则会引起死锁问题的发生。 4.Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现; 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁; 6.Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。Lock可以提高多个线程进行读操作的效率。

java中Lock和synchronize混合使用锁住对象时,为何不能保证数据安全?

java中内置锁synchronized和显式锁Lock在实现上完全不同,两者没有混合使用的办法,不能保证数据安全。
我们都知道,java的synchronized机制,有一个锁对象,在这个锁对象上实现互斥的操作。默认的情况下,会使用当前对象或类实例作为锁对象。我们也可以使用一个相同的锁对象,对不同类的方法或代码块进行保护。
但是,Lock与synchronized的实现方式完全不同,Lock中并不像synchronized中存在互斥的锁对象,而是使用了一个状态计数器,并在尝试获取锁时,使用乐观锁机制,调用CAS操作来重复尝试获取锁。
所以,当我们混合使用synchronized和Lock时,实际上就是使用了两把完全不同的锁,相互没有任何关系。