Synchronized和ReentranLock用法区别

        两者都是多线程的锁,用来保证多线程操作时对于某一段代码块对于共享静态变量操作的线程安全。相对于Synchronized,ReentranLock实现了更多灵活的功能,这些都是Synchronized无法做到的,所以,如果有下列需求,只能用ReentrantLock:

        1)线程当中有IO阻塞或者Thread.sleep()等阻塞线程的代码,如果使用Synchronized,那么其它线程一定要等到这个线程释放锁以后,才能拿到锁,执行锁里的代码块;如果我们要求,其它线程只等待2秒钟就不等了,那么可以使用ReentrantLock的lock.tryLock(2000,TIMEUNIT.MILLISECONDS),表示一旦超过2秒,直接返回;如果我们要求,线程在执行过程中,能够被中断,那么可以使用ReentrantLock的lock.interruptibly()表示可以中断;

        2)线程当中只有读操作,没有写操作时,按道理,读操作与读操作之间是不存在线程安全问题的,读操作只会与写操作存在线程安全问题,这种情况如果使用Synchronized,那么就会给读操作上锁,其它线程的读操作都会锁住,严重影响效率;如果使用ReentrantLock的ReentrantReadLock和ReentrantWriteLock的话,把锁分为读锁和写锁,然后分段加锁,就可以解决这个问题,提高效率;

        除开上面两种情况下,如果Synchronized能满足需求的话,那我们尽量使用Synchronized来加锁,因为JDK团队推荐使得这个,而且在不断提高它的性能。

你可能感兴趣的:(Synchronized和ReentranLock用法区别)