Java Tips: �����������b�N

�Ȃ�΂�傤���� <[email protected]>
2002-07-22 version 1.0.0
�ڎ�
�f���v���O����
�o�C�i�� RWLockDemos.jar
�\�[�X DataKeeper.java
DataViewer.java
DataGenerator.java

ReadWriteLock.java
DummyLock.java
SimpleLock.java
SmarterLock.java
SmartestLock.java
SmartLock.java

RWLockTest.java
ReadAttackTest.java
WriteAttackTest.java

�P���ȃ��b�N�̖��_

Java �ɂ̓}���`�X���b�h�v���O���~���O�ɂ������ʓI�Ȕr��������L�q����̂ɓK���� synchronized �u���b�N�Asynchronized ���\�b�h�Ƃ����\��������A�ی삵�����f�[�^�ɃA�N�Z�X����S�ẴR�[�h�������̍\�����g���ē���������΁A�r������͊ȒP�Ɏ����ł���B�������A���̕��@�ɂ͖�������B�Ⴆ�Γd�q�f���ƒV�X�e���̃��O�f�[�^�ɂ��̕��@��K�p���邱�Ƃ��l���Ă݂悤�B

�d�q�f���‚ɑ΂���A�N�Z�X��S�ē���������Ƃ������Ƃ́A��x�Ɉ�l�̃��[�U�������O�ɃA�N�Z�X�ł��Ȃ��Ƃ������Ƃł���B�Ȃ�炩�̗��R(�T�[�o�E�N���C�A���g�Ԃ̉�����x��N���C�A���g�̏������x�̒ቺ�Ȃ�)�Ń��O�̓ǂݍ��݂Ɏ��Ԃ��������Ă��郆�[�U����l��΁A�T�[�o���̌v�Z�@�����ɂ�����]�T�������Ă��A���̊Ԃ͑��̑吨�̃��[�U�͌f���‚ɃA�N�Z�X�ł��Ȃ��B���Ȃ킿�v�Z�@�����̗��p��������������������B�ǂ��ɂ��Ȃ�Ȃ����낤��?

�������ݎ��̔r������ɂ�闘�p�����̒ቺ�͉䖝���邵���Ȃ��B�������߂�΃��O�f�[�^���j�󂳂��”\�������邩�炾�B�����������̓ǂݍ��݂������ɔ������Ă��A����ɂ���ăf�[�^���j�󂳂�邱�Ƃ͂Ȃ��B����Ȃ�΁A�ǂݍ��ݑ��쓯�m�̔r������͏ȗ����Ă��܂����B����͂��������������B��ʂɓd�q�f���‚ւ̃A�N�Z�X�͏������݂��ǂݍ��݂̕������|�I�ɑ����B�‚܂藘�p�����̒ቺ�̑啔���͓ǂݍ��݃A�N�Z�X�̋����ɂ����̂��B������A�ǂݍ��ݑ��쓯�m�̔r���������߂邾���ŗ��p�����̌��I�ȉ��P�����҂ł���B

�������A�ǂݍ��݂Ə������݂̊Ԃɂ͔r�����䂪�K�v�ł���B�ǂݍ��݂Ə������݂������ɔ�������΁A���O�f�[�^�̔j��͂Ȃ��Ă��A�ǂݍ��񂾃��O�f�[�^�ɕs�����������A���O�̕\���Ȃǂ̏������������s���Ȃ��Ȃ�”\�������邩�炾�B���̏��������邽�߁A�P�ɏ������ݑ���̃R�[�h������ synchronized �u���b�N�œ���������΂悢�A�Ƃ����킯�ɂ͂����Ȃ��̂ł���B

Read-Write Lock

�\1: Read-Write Lock �̃A�N�Z�X����
�����A�N�Z�X�̉”� ���s���̏���
�ǂݍ��� ��������
�v�����ꂽ���� �ǂݍ��� �� �s��
�������� �s�� �s��

�f���‚̗�Ŏ��������́A��ʂɂ́u�ǂݏ������(readers and writers problem)�v�Ƃ��Ēm���Ă���B���̖����������邽�߂ɂ́A�ǂݍ��݂Ə������݂̓��ނ̃A�N�Z�X����ʂ��Đ��䂷�郍�b�N�@�\���K�v�ɂȂ�B�O�͂Ō��������悤�ɁA���̂悤�ȃ��b�N�@�\�� �\1 �̏����𖞂����K�v������B

���̂悤�Ȑ��������u�����������b�N�v�� Read-Write Lock �ƌĂ΂�A���s�v���O���~���O�ɂ�����f�U�C���p�^�[���̈�‚Ƃ��čL���m���Ă��� *�B�ȉ��ł̓f���v���O�����Ŏ��ۂ̓�����m���߂Ȃ��� Java ����ɂ�� Read-Write Lock �̎��������Ă������B


�f���v���O����

Read-Write Lock �̎���������O�ɁARead-Write Lock ���g�p�����f���v���O�����ɂ‚��Đ�������B���̋L���̖`���ł͓d�q�f���‚̗�����������A�f���v���O�����ł͒P�����̂��߂ɐ܂���O���t�������B�܂���O���t�̃f�[�^(int �̔z��)���f���‚̃��O�f�[�^�ɑ�������B������ǂޑO�ɂ܂��f���v���O���� RWLockTest �𓮂����Ă݂ė~�����B�N�����@�͈ȉ��̒ʂ肾(�J�����g�f�B���N�g���� RWLockDemos.jar �̂���f�B���N�g���Ƃ���)�B


 java -classpath RWLockDemos.jar RWLockTest SimpleLock

AWT ���g�����O���t�B�J���ȃf���Ȃ̂� GUI �‹��ŋN�����ė~�����BRWLockTest �̃R�}���h���C���I�v�V����(��̎Α̂̕���)�̓��b�N�̎�ނł���B�����ł͂܂��`���Ŗ��ɂ����u�P���ȃ��b�N�v(��̓I�Ȏ����͌�q)���g���B

�} 1:
RWLockTest �̉��
���X�g1: RWLockTest#main()
public static void main(String[] args) {
    String lockType = args[0];

    DataKeeper data = new DataKeeper(createLock(lockType));
    DataGenerator dg = new DataGenerator(data);
    DataViewer dv1 = new DataViewer(data);
    DataViewer dv2 = new DataViewer(data);

    Frame f = createFrame("Read-Write Lock Test", dv1, dv2);

    dv1.start();
    dv2.start();

    dg.start();
}

�f�������s����ƁB�}1�̂悤�ȉ�ʂ��\�������B�t���[�����ɂ͏㉺��‚̃O���t�\���̈悪����A�����炭���݂�* �T�C���J�[�u�̃O���t��\�����Ă��邾�낤�B���X�g 1�́A���̃f���v���O�����̃��C���֐����̃\�[�X�R�[�h�ł���B��������ĕ�����悤�ɁA���̃f���ɂ�4�l�́u���ҁv���o�ꂷ��B

* �^�C�~���O�ɂ���Ă͌��݂ł͂Ȃ���������Ȃ����A�u�P���ȃ��b�N�v�̌��ʂɂ��A��‚̃O���t�̈�̂�����ɕЕ��������`�撆�ɂȂ�B

�\�ɏo�Ă���̂�2�l�� DataViewer �ł���BDataViewer �̓f�[�^��ǂݍ��݁A���O�̃O���t�\���̈�ɐ܂���O���t��`�悷��B2�l�͂��ꂼ��Ɨ������X���b�h�œ��삵�A�K���ȃC���^�[�o����u���Ȃ��牄�X�ƃO���t�̕`����J��Ԃ��B��ʂ̃O���t�\���͂���2�l�̊����ł���B

���̃O���t�̌��ɂȂ�f�[�^��3�l�ڂ̖��� DataKeeper ���Ǘ����Ă���BDataViewer �̓f�[�^��ǂݍ��ނ��߂� DataKeeper �ɃA�N�Z�X���邪�ADataKeeper �̓R�}���h���C���I�v�V�����Ŏw�肳�ꂽ��ނ̃��b�N���g���ăA�N�Z�X��r�����䂷��B�����ł͑S�ẴA�N�Z�X��r���I�Ɉ����u�P���ȃ��b�N�v���g�p���Ă���̂ŁA2�l�� DataViewer �͓����ɂ̓f�[�^�ɃA�N�Z�X�ł��Ȃ��B

�Ō�̖��҂� DataGenerator �ł���BDataGenerator �̓T�C���J�[�u�̃f�[�^�𐶐����ADataKeeper ��ʂ��ăO���t�f�[�^�ɏ������݂��s���B�ނ� DataViewer �Ɠ��l�ɓƗ������X���b�h�œ��삵�A�K���ȃC���^�[�o����u���Ȃ��牄�X�ƃf�[�^�𐶐����ADataKeeper �ɑ΂��ď������ݑ�����J��Ԃ��B

�Ȃ��A���̃O���t�̕\���͍�����E�ɂ������i�ނ��A����� DataViewer ���O���t�f�[�^��ǂݍ��݂Ȃ���A�l����“ǂݏo�����ɍĕ\���������Ă��邩��ł���B���ݓǂݍ��ݒ��̃f�[�^�̈ʒu�̓O���t���̐Ԃ��c���ŕ\������Ă���B�‚܂�O���t��`�撆�� DataViewer �̓f�[�^�̓ǂݍ��݃A�N�Z�X�̐^���Œ��Ƃ������Ƃł���B�\�����J�n�����Ԃ��c�������[���瓮���Ȃ��ꍇ�A���� DataViewer �� DataKeeper �̔r������ɑj�܂�đ҂�����Ă���Ƃ������ƂɂȂ�B

�܂��ADataGenerator �� DataKeeper �Ƀf�[�^���������ޓx�ɑO��Ƃ͈Ⴄ�V�����f�[�^�𐶐�����B��̓I�ɂ̓T�C���J�[�u�̈ʑ����������‚��炷�B�f���v���O�����𒭂߂Ă���ƕ\�������O���t���E�ɃV�t�g���Ă����̂��킩�邾�낤�B����ɂ���� DataGenerator ���������Ă���̂��킩��B


���b�N�̎���

���X�g 2:
public interface ReadWriteLock {
    public void beginRead();
    public void endRead();

    public void beginWrite();
    public void endWrite();
}
���X�g3: DataKeeper
public class DataKeeper {
    int data[] = new int[360];
    ReadWriteLock lock;

    public DataKeeper(ReadWriteLock lock) {
        this.lock = lock;
    }

    public void write(DataGenerator writer) {
        lock.beginWrite();
        for (int i=0; i<data.length; i++) {
            data[i] = writer.get();
            if(i%5==0) _delay();
        }
        lock.endWrite();
    }
    
    public void read(DataViewer reader) {
        lock.beginRead();
        for (int i=0; i<data.length; i++) {
            reader.put(data[i]);
            if(i%10==0) _delay();
        }
        lock.endRead();
    }

    private void _delay() {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
        }
    }
}

���X�g2 �� Read-Write Lock �̃C���^�[�t�F�[�X ReadWriteLock �̃\�[�X�R�[�h�ł���B���̃C���^�[�t�F�[�X�̎g�����͈ȉ��̒ʂ�ł���B

ReadWriteLock �̎����́A�󋵂ɉ����� beginRead()/beginWrite() �̌Ăяo���ɑ΂��Ă͓K�؂ȃ��b�N�������AendRead()/endWrite() �̌Ăяo���ɑ΂��Ă͓K�؂ȃ��b�N�����������s�����Ƃ����҂����B���ۂ̎g�p��� DataKeeper �̃\�[�X�R�[�h(���X�g3)�����ė~�����B

�ȉ��ł��̂悤�ȃC���^�[�t�F�[�X��������4��ނ̃��b�N�̎�������������*�B

* �f���v���O�����ł͂������ނ̃��b�N(DummyLock)���g�p�ł���B����͑S�Ẵ��\�b�h����́A�S���r��������s��Ȃ������ł���B�f���v���O���������s����Ǝ�����ꂽ�O���t���\������A�f�[�^�j�󂪋N���Ă���̂��킩��B


�P���ȃ��b�N: SimpleLock

���X�g 4: ReadWriteLock
public class SimpleLock implements ReadWriteLock {
    boolean working = false;

    public void beginRead() { lock(); }
    public void endRead() { unlock(); }

    public void beginWrite() { lock(); }
    public void endWrite() { unlock(); }

    protected synchronized void lock() {
        while (working) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        working = true;
    }

    protected synchronized void unlock() {
        working = false;
        notifyAll();
    }
}

���Ɍ��������悤�Ɂu�����������b�N�v�� synchronized �u���b�N�̂悤�ȒP���Ȏd�g�݂ł͎����ł��Ȃ��̂ŁA�E�F�C�g�Z�b�g�𗘗p�������b�N�@�\���g�p����B���̏����Ƃ��āA�u�P���ȃ��b�N�v�̃E�F�C�g�Z�b�g�𗘗p�������� SimpleLock �̃\�[�X�R�[�h(���X�g4)�����Ă݂悤�B��{�I�ȃe�N�j�b�N�Ȃ̂ł��炽�߂ďڍׂ͐������Ȃ����A�ȉ��ɊȒP�ɂ��̎d�g�݂��������B

�ϐ� working �͒N�����f�[�^�ɃA�N�Z�X�����ǂ���(���Ȃ킿�A�N�Z�X���̃X���b�h�����݂��邩�ǂ���)��\���t���O�ł���A�A�N�Z�X���Ȃ� true�A�����łȂ��Ȃ� false �̒l���Ƃ�B

���b�N�𗘗p����X���b�h�͂��̃t���O�����āA����(�ǂݍ��݂܂��͏������݂̃f�[�^�A�N�Z�X)�𑱍s���邩�E�F�C�g�Z�b�g�ɓ����đ҂�(wait())�������߂�B�����𑱍s����ꍇ�́Aworking �t���O�𗧂āA�������I���΃t���O��߂��B�����ăE�F�C�g�Z�b�g�ő҂��Ă��鑼�̃X���b�h�B���N����(notifyAll())�B�N���ꂽ�X���b�h�̂��� this �̃��b�N���l���ł����X���b�h�������𑱍s����B

working �t���O�������Ă���Ԃ́A���̃X���b�h���������n�߂悤�Ƃ��Ă� lock() �̒��ő҂�����邽�߁A��Ɉ�‚̃X���b�h�������f�[�^����������B���̂悤�ɁASimpleLock ���g�����ƂŃf�[�^�ɃA�N�Z�X�ł���X���b�h�͈�x�Ɉ�‚����ƂȂ�A�S�Ẵf�[�^�A�N�Z�X���r�����䂳��邱�ƂɂȂ�B


�Ƃ肠�����̉�: SmartLock

���X�g 5: SmartLock
public class SmartLock implements ReadWriteLock {
    int readingReaders = 0;
    boolean writing = false;

    public synchronized void beginRead() {
        while (writing) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        readingReaders++;
    }

    public synchronized void endRead() {
        readingReaders--;
        notifyAll();
    }

    public synchronized void beginWrite() {
        while (writing || readingReaders > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        writing = true;
    }

    public synchronized void endWrite() {
        writing = false;
        notifyAll();
    }
}

����ł́u�����������b�N�v�̎����̈�� SmartLock �̃\�[�X�R�[�h(���X�g 5)�����Ă݂悤�B

SimpleLock �ɂ����� working �t���O�́Awriting �t���O�� readingReaders �ɂȂ��Ă���BSmartLock �ł� SimpleLock �ɂ�����u�A�N�Z�X���v�Ƃ�����Ԃ��A���ׂ����u�������ݒ��v�Ɓu�ǂݍ��ݒ��v�̑g���킹�ŕ\�������킯���B

writing �t���O�͒N�����f�[�^�ɏ������ݒ����ǂ���(�������ݒ��̃X���b�h�����݂��邩�ǂ���)��\���t���O�ł���A�������ݒ��Ȃ� true�A�����łȂ��Ȃ� false �̒l���Ƃ�BreadingReaders �̓f�[�^��ǂݍ��ݒ��̃X���b�h�̐���\���A0 �܂��͐��̐����̒l���Ƃ�BreadingReaders ���P���ȃt���O�łȂ��̂́ASmartLock ���ǂݍ��݂̕��񓮍���������߂ł���B�ǂݍ��ݒ��̃X���b�h���S���������I�������Ƃ��m�F���邽�߂ɂ͂����̃X���b�h�̐��𐔂��Ă����Ȃ��Ă͂Ȃ�Ȃ��B

���̃��b�N���ǂ̂悤�ɓ��삷�邩���l����B

�܂� beginWrite() �� endWrite() �������g�p�����󋵂��l���悤�B���̎� readingReaders �͏�� 0 �ł��邩��AbeginWrite() �� while ���ɂ������ readingReaders > 0 �͖����Ă������ł���B�Ƃ������Ƃ́A���̏󋵂ł� beginWrite() / endWrite() �́ASimpleLock �ɂ����� lock() / unlock() �ƑS�������\�������‚��ƂɂȂ�(writing �t���O�� SimpleLock �ɂ����� working �t���O�ɑ���)�B����āA�������݃A�N�Z�X���m�͔r�����䂳��邱�Ƃ��킩��B

���� beginRead() �� endRead() �������g�p�����󋵂��l���悤�B���̎� writing �t���O�͏�� false �ł��邩��AbeginRead() �� while ���[�v�S�̂������Ă������Ƃ������ƂɂȂ�BreadingReaders �̃J�E���g�͍s���邪 beginRead() �� endRead() �����̕ϐ����Q�Ƃ��Ȃ��̂ŁA����������Ă������ł���BendRead() �� notifyAll() ���Await() ����X���b�h�����݂��Ȃ��ȏ㖳���ł���B�‚܂�A���̏󋵂ł� beginRead() / endRead() �͉������Ă��Ȃ����ƂɂȂ�B����āA�ǂݍ��݃A�N�Z�X���m�͔r�����䂳�ꂸ�A�������ɓ������s����邱�Ƃ��킩��B

����ł͓ǂݍ��݂Ə������݂̃A�N�Z�X���Փ˂����ꍇ�͂ǂ����B�܂��ǂݍ��ݒ��ɏ������݂��悤�Ƃ����ꍇ���l����B�ǂݍ��ݒ��̃X���b�h������� readingReaders �͐��l�ł��邩��A�����������Ƃ����X���b�h�� beginWrite() �� while ���[�v�̒��ŃE�F�C�g�Z�b�g�ɓ���A�҂�����邱�ƂɂȂ�B���ɁA�������ݒ��ɓǂݍ��݂��悤�Ƃ����ꍇ���l����B���̎� writing �t���O�� true �ł��邩��A�ǂݍ������Ƃ����X���b�h�� beginRead() �� while ���[�v�̒��ŃE�F�C�g�Z�b�g�ɓ���A�҂�����邱�ƂɂȂ�B����āA�ǂݍ��݃A�N�Z�X�Ə������݃A�N�Z�X�͔r�����䂳��A�����ē����ɂ͏�������Ȃ��B

�ȏ�̍l�@���� SmartLock ���\ 1�� Read-Write ���b�N���������ׂ�����������Ă邱�Ƃ��킩�����B���ۂɃf���v���O�������R�}���h���C�������� SmartLock ��^���ċN�����āA�A�N�Z�X���������サ�Ă��邱�Ƃ��������ė~�����BSimpleLock �ł̓O���t�`�悪��‚ÂŽ��s����Ă����̂��ASmartLock �ł͓�‚̃O���t�`�悪�����Ɏ��s����Ă���̂��킩�邾�낤�B

����Łu�ǂݏ������v�͉����̂͂��c�B���������̏͂̃^�C�g����������x�悭���ė~�����B�u�Ƃ肠�����̉��v�Ə����Ă���B�����s�����ȏ������ł͂Ȃ����B��̉����܂����̂��낤?


���b�N�A�E�g��h��: SmarterLock

���͏�� SmartLock �Ɋւ���l�@�ɂ͏d��ȗ��Ƃ���������B�m���Ƀf�[�^���j�󂳂ꂽ��A�s���S�ȃf�[�^���ǂݍ��܂�邱�Ƃ͂Ȃ��B�������A�Ⴆ�Έȉ��̂悤�Ȃ��Ƃ��N�肤��̂��B

���ӂ̂���U���҂��d�q�f���‚̉^�c��W�Q���悤�ƍl�����B���O�f�[�^�� SmartLock �Ŏ���Ă���j�󂷂邱�Ƃ͕s�”\���B�f���ƒT�[�o�ɂ͏\���ȏ����\�͂�����A�U���҂̎莝���̎���(�ᑬ����Ɍq������2��̒[��)�ł��̔\�͂��g���؂邱�Ƃ͕s�”\���B���������̍U���҂͂܂�܂ƍU���ɐ��������B�ނ��U�����Ă���ԁA�N���f���‚ɏ������݂ł��Ȃ��Ȃ����̂��B��̔ނ͉��������̂��낤��?

�햾����������ƁA�ނ�2��̒[���Ɍ��݂Ɍf���‚������[�h�������̂��B���̏ꍇ�����[�h�̃^�C�~���O���d�v�ɂȂ�B�Е��̒[���ł̃����[�h���I���Ȃ������ɁA�����Е��̒[���̃����[�h���J�n����A�Ƃ�����������݂ɌJ��Ԃ��K�v������B������V�~�����[�g�����̂��f���v���O���� ReadAttackTest ���B�N�����@�͈ȉ��̒ʂ�B


java -classpath RWLockDemos.jar ReadAttackTest SmartLock

RWLockTest �Ɠ��l�̉�ʂ��o�邪�A�����ƃt���b�g�ȃO���t���\������A�O���t�f�[�^���X�V����Ȃ��̂��킩�邾�낤*�B���Ȃ݂ɁA���̍U���� SimpleLock �ɂ͒ʗp���Ȃ�(�R�}���h���C�������� SmartLock �̂����� SimpleLock ���w�肵�Ċm���߂邱�Ƃ��ł���)�B

* ���̃f���͐��m�ȃ^�C�~���O�����S�Ɉێ�����悤�ɂ͂Ȃ��Ă��Ȃ��B�����ԕ��u���Ă����ƁA�A�N�Z�X�^�C�~���O�����񂾂񂸂�Ă��āA�Е��̃X���b�h���x�e���ɂ����Е��̃X���b�h�ɂ��ǂݍ��݂��I����Ă��܂����Ƃ�����B�����Ȃ�Ə������ݑ��̃X���b�h������ł���悤�ɂȂ�A�O���t�f�[�^���X�V�����B

������x SmartLock �̃\�[�X�R�[�h(���X�g5)���悭���ė~�����BbeginWrite() �� while ���[�v�̏�������肾�B��ɏq�ׂ��悤�ȍU�����󂯂Ă���Ԃ͏�� readingReaders > 0 �����藧�‚̂ŁA�������݂��悤�Ƃ��Ă���X���b�h�́A������ notifyAll() �ŋN����Ă������܂� while ���[�v�̒��ő҂�����Ă��܂��A�����đO�ɂ͐i�߂Ȃ��B��������b�N�A�E�g�ƌĂ΂�錻�ۂ��B���b�N�A�E�g�̓f�b�h���b�N�ƈقȂ�v�Z�@����~���Ă��܂��킯�ł͂Ȃ����A����̏������S�����s����Ȃ��Ȃ�B

���X�g 6: SmarterLock
public class SmarterLock implements ReadWriteLock {
    int readingReaders = 0;
    int waitingWriters = 0;
    boolean writing = false;

    public synchronized void beginRead() {
        while (writing || waitingWriters > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        readingReaders++;
    }

    public synchronized void endRead() {
        readingReaders--;
        notifyAll();
    }

    public synchronized void beginWrite() {
        waitingWriters++;
        while (writing || readingReaders > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        waitingWriters--;
        writing = true;
    }

    public synchronized void endWrite() {
        writing = false;
        notifyAll();
    }
}

���̖������������̂��A�u�����Ƃ����������b�N�v SmarterLock �ł���(���X�g6)�BSmarterLock �� SmartLock �̉��nj^�ł���(���X�g���̑����̕����� SmartLock ����̕ύX�_�ł���)�B�V���� waitingWriters �Ƃ����ϐ����lj�����Ă��邪�AbeginWrite() �̃R�[�h������΂킩��悤�ɁA����͏������݂����݂��� beginWrite() ���ő҂�����Ă��܂����X���b�h�̐���\���悤�ɂȂ��Ă���B

������ beginRead() �� while ���̏����� waitingWriters > 0 ���lj�����Ă���B�������݂�҂��Ă���X���b�h�����݂���΁A�ǂݍ��݂����݂��X���b�h���E�F�C�g�Z�b�g�ɓ����đ҂‚̂ł���B����́A�҂��Ă��鏑�����݃X���b�h������΁A�ǂݍ��ݒ��̃X���b�h�͂���ȏ㑝�����Ɍ������ł���A�₪�Ă� readingReader == 0 �ɂȂ�A�Ăя������݃X���b�h�����s�”\�ɂȂ邱�Ƃ��Ӗ�����B���̎��A�҂��Ă���ǂݍ��݃X���b�h�͂܂����s�ł��Ȃ��BwaitingWriters > 0 ���܂����藧���Ă��邩�炾�B����āA�҂��Ă���X���b�h�̒��ł́A�������݃X���b�h���D��I�Ɏ��s����邱�ƂɂȂ�B

��قǂ� ReadAttackTest ���R�}���h���C�������� SmarterLock ��^���ċN������ƁA���͂₱�̍U�����ʗp���Ȃ����Ƃ��m�F�ł���B


���b�N�A�E�g�����S�ɖh��: SmartestLock

�������ASmarterLock ���܂����S�ł͂Ȃ��B���͏�ŏq�ׂ������[�h�U���Ɠ��l�̎菇���������ݑ���ɓK�p���ă��b�N�A�E�g��Ԃɂł���̂��B������V�~�����[�g�����̂��f���v���O���� WriteAttackTest ���B�N�����@�͈ȉ��̒ʂ�B


java -classpath RWLockDemos.jar WriteAttackTest SmarterLock

���̃f���ł͂��‚܂Ōo���Ă��O���t�`�悪�n�܂�Ȃ�*�B���Ȃ݂ɁA���̍U���� SmartLock �� SimpleLock �ɂ͒ʗp���Ȃ��B

* ���̃f������͂萳�m�ȃ^�C�~���O�����S�Ɉێ��ł��Ȃ����߁A�����ԕ��u���Ă����ƃO���t�`�悪�n�܂邱�Ƃ����肤��B

���X�g 7: SmartestLock
public class SmartestLock implements ReadWriteLock {
    int readingReaders = 0;
    int waitingWriters = 0;
    boolean preferWriter = true;
    boolean writing = false;

    public synchronized void beginRead() {
        while (writing || (preferWriter && waitingWriters > 0)) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        readingReaders++;
    }

    public synchronized void endRead() {
        readingReaders--;
        preferWriter = true;
        notifyAll();
    }

    public synchronized void beginWrite() {
        waitingWriters++;
        while (writing || readingReaders > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        waitingWriters--;
        writing = true;
    }

    public synchronized void endWrite() {
        writing = false;
        preferWriter = false;
        notifyAll();
    }
}

�����̕���(�Ⴆ�� [Wei02] �� [Khan02])�ł͂��̋L���� SmarterLock �����̂��̂� Read-Write Lock �Ƃ��ďЉ��Ă��邪*�A[����02] �ł͏������ݍU���ɂ��ς�������ǔł��Љ��Ă���B�����ł͂�����u�ł������������b�N�v SmartestLock �ƌĂڂ��B���X�g7�́ASmarterLock �̐i���`�ɂȂ�悤�� [����02] ���኱���ς������̂ł���(���������� SmarterLock ����̕ύX�_)�B

* ���X Read-Write Lock ���������݂��ǂݍ��݂������󋵂�z�肵�Ă��邱�Ƃ��l����ƁA�ǂݍ��ݍU���Ɏ����󋵂̓A�N�Z�X���W�������Ƃ��ɋ��R��������”\���������̂��A�������ݍU���Ɏ����󋵂͋��R�ɂ͋N��ɂ����ł��낤�B���������Ӗ��� SmarterLock �ŏ\���Ƃ��錩�������邾�낤�B

SmartestLock �ł͐V���� preferWriter �Ƃ����t���O����������Ă���B���̃t���O�̖�ڂ��l���Ă݂悤�B

SmarterLock �ŏ������ݍU������������̂́A�����҂��X���b�h�̒�����҂��Ă��鏑�����݃X���b�h���D��I�Ɏ��s�����̂������ł���B�U�����́A��������ėD��I�Ɏ��s���ꂽ�������݃X���b�h���������I����O�ɁA�V���ȏ������݃X���b�h���҂���ԂɂȂ�A���̃X���b�h���ĂїD��I�Ɏ��s����邽�߁A���‚܂ł����Ă��ǂݍ��݃X���b�h�����s����Ȃ��̂��B

������ SmartestLock �ł� preferWriter �t���O���I���ȓ���������B�܂��A�҂��Ă��鏑�����݃X���b�h�����݂��A���̃X���b�h��҂����Ă����ǂݍ��݃X���b�h���������I�����Ƃ���B���̎� preferWriter �� true �ł���AbeginRead() �� while ���̏��� preferWriter && waitingWriters > 0 �͐^�ƂȂ�B�]���Ă����ł� SmarterLock �Ɠ��l�A�������݃X���b�h���D��I�Ɏ��s�����B

�������A�������݃X���b�h���������I����ƁApreferWriter �� false �ɂȂ邽�� beginRead() �� while ���̏����͋t�]���A�ǂݍ��݃X���b�h�ɂ����s�̃`�����X���^������B�^�����������݃X���b�h�����s����Ă��ApreferWriter �� false �̂܂܂Ȃ̂ł܂��`�����X������Ă���B�^�ǂ��ǂݍ��݃X���b�h�����s������ preferWriter �� true �ɂȂ��čĂя������݃X���b�h�D��ɂȂ�B���̂悤�� preferWriter �t���O�݂͌��Ɏ��s�̃`�����X�����荇���悤�ɐU�镑�����߁A�ǂݍ��݂��������݂����b�N�A�E�g���邱�Ƃ��A�������݂��ǂݍ��݂����b�N�A�E�g���邱�Ƃ��Ȃ��B

�Ō�� RWLockTest, ReadAttackTest, WriteAttackTest �̊e�f�����A�R�}���h���C�������� SmartestLock ���w�肵�Ď��s���Ă݂ė~�����BSmartestLock �� SmartLock �Ɠ��l�Ɍ����I�ɓ��삵�A�ǂݍ��݁E�������ݗ����̍U���ɂ��ς�����̂��m�F�ł���͂����B


�܂Ƃ�

�Q�l����