Looking for java Keywords? Try Ask4Keywords

Java Language Замки как средства синхронизации


пример

До внедрения параллельного пакета Java 5 потоки были более низкими. Введение этого пакета обеспечило несколько вспомогательных программных средств / конструкций, поддерживающих более высокий уровень.

Замки - это механизмы синхронизации потоков, которые по существу служат той же цели, что и синхронизированные блоки или ключевые слова.

Внутренняя блокировка

int count = 0; // shared among multiple threads

public void doSomething() {
    synchronized(this) {
        ++count; // a non-atomic operation
    }
}

Синхронизация с использованием замков

int count = 0; // shared among multiple threads

Lock lockObj = new ReentrantLock();
public void doSomething() {
    try {
        lockObj.lock();
        ++count; // a non-atomic operation
    } finally {    
        lockObj.unlock(); // sure to release the lock without fail
    }
}

Блокировки также имеют функциональные возможности, которые встроенная блокировка не предлагает, например, блокировка, но остается реагирующей на прерывание или пытается заблокировать, а не блокировать, когда не удается.

Блокировка, реагирующая на прерывание

class Locky {
    int count = 0; // shared among multiple threads

    Lock lockObj = new ReentrantLock();

    public void doSomething() {
        try {
            try {
                lockObj.lockInterruptibly();
                ++count; // a non-atomic operation
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // stopping
            }
        } finally {
            if (!Thread.currentThread().isInterrupted()) {
                lockObj.unlock(); // sure to release the lock without fail
            }
        }
    }
}

Делайте только то, что можно заблокировать

public class Locky2 {
    int count = 0; // shared among multiple threads

    Lock lockObj = new ReentrantLock();

    public void doSomething() {
        boolean locked = lockObj.tryLock(); // returns true upon successful lock
        if (locked) {
            try {
                ++count; // a non-atomic operation
            } finally {
                lockObj.unlock(); // sure to release the lock without fail
            }
        }
    }
}

Существует несколько вариантов блокировки. Для более подробной информации обратитесь к api docs здесь