ReadWriteLock

    读写锁分为读锁和写锁,读锁不是互斥的,多个线程能够同时持有读锁,可是写锁是互斥的,最有有一个在持有。java

1、读锁和读锁之间不互斥:

public static void main(String[] args) throws Exception {
        final ReadWriteLock lock = new ReentrantReadWriteLock();
        final Lock readLock = lock.readLock();
        final Lock writeLock = lock.writeLock();
        Thread readThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 5; i++) {
                        readLock.lock();
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在读取。。。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    readLock.unlock();
                }
            }
        });
        Thread readThread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 5; i++) {
                        readLock.lock();
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在读取。。。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    readLock.unlock();
                }
            }
        });
        readThread.start();
        readThread2.start();
    }

2、读锁和写锁互斥:ide

public static void main(String[] args) throws Exception {
        final ReadWriteLock lock = new ReentrantReadWriteLock();
        final Lock readLock = lock.readLock();
        final Lock writeLock = lock.writeLock();
        Thread write = new Thread(new Runnable() {
            @Override
            public void run() {
                writeLock.lock();
                try {
                    for (int i = 0; i < 5; i++) {
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在写入。。。");
                    }
                } catch (InterruptedException e) {

                } finally {
                    writeLock.unlock();
                }
            }
        });
        Thread readThread = new Thread(new Runnable() {
            @Override
            public void run() {
                readLock.lock();
                try {
                    for (int i = 0; i < 5; i++) {
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在读取。。。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    readLock.unlock();
                }
            }
        });
        write.start();
        readThread.start();
    }

3、写锁和写锁互斥spa

public static void main(String[] args) throws Exception {
        final ReadWriteLock lock = new ReentrantReadWriteLock();
        final Lock readLock = lock.readLock();
        final Lock writeLock = lock.writeLock();
        Thread write = new Thread(new Runnable() {
            @Override
            public void run() {
                writeLock.lock();
                try {
                    for (int i = 0; i < 5; i++) {
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在写入。。。");
                    }
                } catch (InterruptedException e) {

                } finally {
                    writeLock.unlock();
                }
            }
        });
        Thread write2 = new Thread(new Runnable() {
            @Override
            public void run() {
                writeLock.lock();
                try {
                    for (int i = 0; i < 5; i++) {
                        TimeUnit.SECONDS.sleep(1);
                        System.out.println(Thread.currentThread().getName() + "在写入。。。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    writeLock.unlock();
                }
            }
        });
        write.start();
        write2.start();
    }

相关文章
相关标签/搜索