秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock (续)

java 包实现了读写锁的操作:

package com.multithread.readwritelock;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import com.multithread.main.ExampleInterface;
import com.multithread.readwrite.WriteThread;

public class ReadWriteLockExample extends ExampleInterface {

    public ReadWriteLock mReadwriteLock = new ReentrantReadWriteLock(false);
    public File mFile = null;
    public int mCash = 10000;
    public CountDownLatch mLatchDown = new CountDownLatch(6);
    private boolean mStopedFlag = false;

    @Override
    public void startDemo() {
        // TODO Auto-generated method stub
        mFile = new File("H:\\Project\\SST\\123.txt");
        try {

            mFile.createNewFile();
            Executor mEcecutor = Executors.newFixedThreadPool(2 + 4);
            mEcecutor.execute(new Reader("Reader1"));
            mEcecutor.execute(new Reader("Reader2"));
            mEcecutor.execute(new Reader("Reader3"));
            mEcecutor.execute(new Reader("Reader4"));
            mEcecutor.execute(new Writer("Writer1", 2000));
            mEcecutor.execute(new Writer("Writer2", -3000));

            mLatchDown.await();
            System.out.println("[startDemo]" + "Demo down");

        } catch (IOException | InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public class Reader extends Thread {

        public String name = null;
        boolean flag = true;
        private int index = 0;

        public Reader(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            while (flag) {
                try {
                    mReadwriteLock.readLock().lock();
                    System.out.println("[Reader]" + name + "start");
                    Thread.sleep((long) (Math.random() * 100));
                    if (!mStopedFlag) {
                        System.out.println("[Reader]" + name + "get mcash now:"
                                + mCash);
                    } else {
                        flag = false;
                    }
                    Thread.sleep((long) (Math.random() * 100));
                    System.out.println("[Reader]" + name + "down");
                    mReadwriteLock.readLock().unlock();
                    Thread.sleep((long) (Math.random() * 1000));
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
            mLatchDown.countDown();

        }

    }

    public class Writer extends Thread {

        public String name = null;
        boolean flag = true;
        private int index = 0;
        private int cash = 0;

        public Writer(String name, int addcash) {
            this.name = name;
            this.cash = addcash;
        }

        @Override
        public void run() {
            System.out.println("[Writer]" + name + "start");
            while (flag) {

                try {
                    mReadwriteLock.writeLock().lock();
                    System.out.println("[Writer]" + name + "start");
                    Thread.sleep((long) (Math.random() * 100));
                    int oldcash = mCash;
                    if (mCash <= 0) {
                        flag = false;
                        mStopedFlag = true;
                    } else {
                        mCash += cash;
                        System.out.println("[Writer]" + name
                                + "operator cash old:" + oldcash + " To:"
                                + mCash);
                    }
                    Thread.sleep((long) (Math.random() * 100));
                    System.out.println("[Writer]" + name + "down");
                    mReadwriteLock.writeLock().unlock();
                    Thread.sleep((long) (Math.random() * 1000));
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            mLatchDown.countDown();
        }

    }

}

读写锁的特点就是:

1.写者与读者是互斥的

2.每个写者之间是互斥的

3.读者之间可以同时进行

posted on 2014-11-21 16:15  Joyfulmath  阅读(350)  评论(0编辑  收藏  举报

导航