Разница между блокировками чтения / записи и синхронизированными показана в базовом коде - PullRequest
0 голосов
/ 19 января 2019

В моей домашней работе мне нужно показать разницу между блокировкой чтения / записи и использованием «синхронизированного» ключевого слова в коде. Я действительно не знаю, как это сделать, и каков четкий способ понять эту разницу. Мне также нужно показать разницу во времени между выполнением одной и той же задачи в обоих направлениях. Вот код, который я пробовал (хотя и без синхронизации)

public class Main {

    public static void main(String[] args) {

        Number number = new Number(5);

        Thread t1 = new Thread(){
            public void run(){
                System.out.println(number.getData());
                number.changaData(10);
                System.out.println(number.getData());
            }};
            Thread t2 = new Thread(){
                public void run(){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(number.getData());
                    number.changaData(20);
                    System.out.println(number.getData());
                }};

                t2.start();
                t1.start();
    }
}


public class Number {

    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock readLock = rwl.readLock();
    private final Lock writeLock = rwl.writeLock();
    int value;

    public Number(int value) {
        this.value = value;
    }

    public int getData() {
        readLock.lock();
        try {
            return value;
        }
        finally {
            readLock.unlock();
        }
    }

    public int changaData(int change) {
        writeLock.lock();
        try {
            value = change;
            return value;
        }
        finally {
            writeLock.unlock();
        }
    }
}

1 Ответ

0 голосов
/ 19 января 2019

Разница между синхронизированными и блокировками чтения / записи такова, что при использовании синхронизированного доступа к нему одновременно доступен только один поток.С блокировкой чтения / записи вы можете одновременно иметь несколько считывателей (учитывая, что блокировок записи уже нет), поэтому в некоторых случаях вы можете получить лучшую параллельную производительность, особенно при большом количестве операций чтения.

Выследует добавить еще много потоков, обращающихся к этому объекту, для проверки производительности.

И вы можете просто посчитать время между завершением и началом операций для измерения производительности (например, Long startTime = System.nanoTime ();).

Прочтите здесь, чтобы узнать, как проверить, закончился ли поток, чтобы вы могли измерить время выполнения: Как узнать, закончили ли другие потоки?


editответить на комментарий: Эй, мой ответ немного упрощен (хорошо, очень, так как многопоточность трудна), так как я писал это в промежутке между работой, поэтому сейчас я могу связать вас с некоторыми другими ресурсами, которые предоставляют больше информации.Глубина взгляда.

очень простой примерв соответствии с вашим существующим классом:

class Number {

    private int value;

    public Number(int value) {
        this.value = value;
    }

    public synchronized int getValue() {
        return value;
    }

    public synchronized int changeData(int change) {
        value = change;
        return value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...