Java重入锁

看好了,我只表演一次

/**
 * 重入锁可以完全替代Synchronized关键字,但其必须显式的调用unlock。
 * 建议视为Synchronized的高级版,比起Synchronized关键字,
 * 其可定时、可轮询并含有可中断的锁获取操作,公平队列以及非块结构的锁。
 */
public class ReeterLock implements Runnable{
    
    
    /**
     * 重入锁演示
     *
     */
    public static ReentrantLock lock = new ReentrantLock();

    public static int i = 0;

    /**
     * 那么我们可以明显的看到重入锁保护着临界区资源i,确保多线程对i操作的安全。在demo中我们也是加了3次锁并释放了3次锁。
     *
     * 需要注意的是,如果同一线程多次获得锁,那么在释放锁的时候,也必须释放相同次数。
     * 如果释放的次数多了,会得到一个java.lang.IllegalMonitorStateException异常;
     * 反之则会导致当前线程一直持有该锁,导致其他线程无法进入临界区。
     */
    @Override
    public void run() {
    
    
        for (int j=0;j<10000;j++){
    
    
            //手动上锁,可以上N把,这里是为了演示
            lock.lock();
            lock.lock();
            lock.lock();
            try {
    
    
                i ++;
            } finally {
    
    
                //无论如何必须释放锁,上几把 释放几把
                lock.unlock();
                lock.unlock();
                lock.unlock();
            }
        }
    }

    public static void main(String[] a) throws InterruptedException {
    
    
        ReeterLock rl = new ReeterLock();
        Thread t1 = new Thread(rl);
        Thread t2 = new Thread(rl);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.print(i);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_46580493/article/details/130369154