Java ReEntrantLock (Java代码实战-001)

Lock类也可以实现线程同步,而Lock获得锁需要执行lock方法,释放锁需要执行unLock方法

Lock类可以创建Condition对象,Condition对象用来使线程等待和唤醒线程,需要注意的是Condition对象的唤醒的是用同一个Condition执行await方法的线程,所以也就可以实现唤醒指定类的线程

Lock类分公平锁和不公平锁,公平锁是按照加锁顺序来的,非公平锁是不按顺序的,也就是说先执行lock方法的锁不一定先获得锁 Lock类有读锁和写锁,读读共享,写写互斥,读写互斥

 

import java.sql.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReEntrantLockTest
 */
public class ReEntrantLockTest {
    private static final int THREAD_COUNT = 4;
    private static final int WAIT_TIMES = 5;

    public static void main(String[] args) {
        // 默认是非公平锁
        final ReentrantLock lock = new ReentrantLock();

        final Condition con = lock.newCondition();
        final Runnable add = new Runnable() {
            @Override
            public void run() {
                System.out.println("Time: " + new java.util.Date() + " Pre " + lock);
                // 获取到锁的话立即返回,否则一直处于等待状态
                lock.lock();
                try {
                    // 使当前线程处于等待状态,直到被信号通知或中断,此线程处于等待状态,其它线程也可以获取锁
                    con.await(WAIT_TIMES, TimeUnit.SECONDS);

                    // seleep状态时则不会释放锁
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println("Time:" + new java.util.Date() + " Post " + lock);
                    lock.unlock();
                }
            }
        };

        final ExecutorService exec = Executors.newFixedThreadPool(THREAD_COUNT);
        for (int i = 0; i < THREAD_COUNT; i++) {
            exec.submit(add);
        }
        exec.shutdown();
    }
}

 

猜你喜欢

转载自www.cnblogs.com/frankyou/p/9052339.html