Synchronized(同步锁)
在Java中使用多线程,同步锁这个概念是十分重要的。
平时的开发过程中,你必然会遇到一个问题:多个线程共享一个或者一组资源,这资源包括内存、文件等,在多个线程对这组资源进行读写操作时,如何保持数据的准确性同步一致,这是至关重要的。
很常见的一个例子是,张三在银行账户存有1000元,李四和张三同时对这个账号在不同取款机多次的存取100,在这之后账户还有多少钱?
Lock(锁)
Lock对比synchronized总结有以下差异:
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率。
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
Lock的操作与synchronized相比,灵活性更有Lo高,而且Lock提供多种方式获取锁,ck、ReadWriteLock接口,以及实现这两个接口的ReentrantLock类、ReentrantReadWriteLock类。