我们知道,可以利用synchronized关键字来实现共享资源的互斥访问。 Java 5在java.util.concurrent.locks包下提供了另一种来实现线程的同步访问,那就是Lock。既然有了synchronized来 实现线程同步,Java为什么还需要提供Lock呢?
synchronized是Java的一个关键字,当我们使用synchronized来修饰方法或代码块时,线程必须先获得对应的锁才能执行该段代码。而其他线程只能一直等待,直到当前线程释放锁并获得对应的锁才能进入该段代码。这里获取锁的线程释放锁只会有两种情况:
  • 获取锁的线程执行完该段代码,线程会释放占有的锁;
  • 线程执行发生异常,此时JVM会让线程自动释放锁。
那么如果这个占有锁的线程由于等待IO或其他原因(比如调用sleep方法)被阻塞,但是还没有释放锁,那么其他线程只能干巴巴的等着,试想这多么影响程序的执行效率。
当多个线程同时读写文件是,我们知道读操作和写操作会发生冲突,写操作和写操作 也会发生冲突,但是读操作和读操作之间不会冲突。synchronized关键字对一段代码加锁,所有的线程必须先获得对应的锁才有该代码段的执行权限。 如果多个线程同时进行读操作时,使用synchronized关键字会导致在任何时刻只有一个线程读,其他线程等待,大大降低执行效率。
Lock可以对以上种种情况作优化,提供更好的执行效率。另外,Lock方便了 对锁的管理,可以自由的加锁和释放锁,还可以判断有没有成功获取锁。但是在使用Lock时要注意,Lock需要开发者手动去释放锁,如果没有主动释放锁, 就要可能导致死锁出现。建议在finally语句块中释放Lock锁。
 

concurrent.locks包下常用类

1. Lock
 
首先要说明的是Lock,它是一个接口:
    public interface Lock {  
        void lock();  
        void lockInterruptibly() throws InterruptedException;  
        boolean tryLock();  
        boolean tryLock(long time, TimeUnit unit) throws InterruptedException;  
        void unlock();  
        Condition newCondition();  
    }  
View Code

相关文章:

  • 2022-01-12
  • 2021-11-21
  • 2021-11-06
  • 2022-12-23
  • 2021-05-30
  • 2021-09-11
  • 2022-12-23
  • 2018-08-27
猜你喜欢
  • 2021-06-02
  • 2021-11-24
  • 2022-12-23
  • 2022-02-08
  • 2021-08-29
  • 2021-10-26
  • 2022-12-23
相关资源
相似解决方案