多线程(二)重入锁

   学习过线程相关知识的朋友都应该已经知道,同步控制对于并发控制的重要性,synchronized关键字是最简单的一种控制方法。它决定了一个线程是否可以访问临界区。而Object类中的wait()和notify()/notifyAll()方法也是一些线程之间通信的工具。但是,当我们想更加灵活的区规定何时加锁,何时释放锁时,synchronized就显得力所不及了。这时我们就引入了一个新的概念—重入锁。

重入锁(ReentrantLock)

   他是java并发核心包java.util.concurrent包下的子包java.util.concurrent.locks里面的一个类。下面先简单展示其使用案例:
    public class ReentrantLockDemo implements Runnable {
        private static ReentrantLock reenterLock = new ReentrantLock();
        private static int i = 0;
    @Override
    public void run() {
        for(int j = 0;j<10;j++){
            reenterLock.lock();
            reenterLock.lock();
            try {
                i++;
                System.out.println(Thread.currentThread().getName()+"正在操作!!!");
            }finally {
                reenterLock.unlock();
                reenterLock.unlock();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReentrantLockDemo r = new ReentrantLockDemo();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(i);
    }
  }

结果如下:

Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
20

上述代码中使用了重入锁保护临界资源,可以有我们自己规定何时加锁何时释放锁。记住一旦加了锁,必须要释放,否则以后的线程则再无法获得锁。

猜你喜欢

转载自blog.csdn.net/jackFXX/article/details/78963029
今日推荐