Java显示锁是指在Java中使用synchronized关键字来实现的锁,它是一种显式的、可重入的互斥锁。当一个线程获得了一个对象上的显式锁时,其他线程就不能再访问这个对象上的同步代码块,直到这个锁被释放。
隐式锁是指在Java中使用内部机制来实现的锁,它是一种隐式的、可重入的互斥锁。当一个方法被调用时,JVM会在方法执行前后加上隐式锁,从而保证多个线程之间不会同时执行这个方法。
public synchronized void method(){ //do something }
显式锁定机制可以用于协调对多线程环境中的共享资源的访问。
在java.util.concurrent.locks包中声明的Lock接口定义了显式锁定操作。
ReentrantLock类在同一个包中,是Lock接口的具体实现。
Lock接口声明如下:
public interface Lock { void lock(); Condition newCondition(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); }
lock()方法获取一个锁的行为与使用synchronized关键字相同。
我们必须在完成锁定后通过调用Lock接口的unlock()方法释放锁定。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Main { // Instantiate the lock object private Lock myLock = new ReentrantLock(); public void updateResource() { try { // Acquire the lock myLock.lock(); } finally { // Release the lock myLock.unlock(); } } }
下面的代码模拟哲学家,假设ReentrantLock类的一个对象表示一个fork。
import java.util.concurrent.locks.Lock; class Philosopher { private Lock leftFork; private Lock rightFork; private String name; // Philosopher"s name public Philosopher(Lock leftFork, Lock rightFork, String name) { this.leftFork = leftFork; this.rightFork = rightFork; this.name = name; } public void think() { System.out.println(name + " is thinking..."); } public void eat() { if (leftFork.tryLock()) { try { if (rightFork.tryLock()) { try { System.out.println(name + " is eating..."); } finally { rightFork.unlock(); } } } finally { leftFork.unlock(); } } } }
ReentrantReadWriteLock类是ReadWriteLock接口的实现。只有一个线程可以保持ReentrantReadWriteLock的写锁,而多个线程可以保持其读锁。
下面的代码演示了ReentrantReadWriteLock的用法。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Main { private int value; private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private Lock rLock = rwLock.readLock(); private Lock wLock = rwLock.writeLock(); public Main(int value) { this.value = value; } public int getValue() { rLock.lock(); try { return this.value; } finally { rLock.unlock(); } } public void setValue(int value) { wLock.lock(); try { this.value = value; } finally { wLock.unlock(); } } }
Java线程教程 -Java线程局部变量线程局部变量分隔每个线程的变量的值。java.lang包中的ThreadLocal类提供了一个线程局部变量的实...
Java网络教程 -Java网络UDP套接字TCP套接字是面向连接的,基于流。基于UDP的套接字是无连接的,基于数据报。使用UDP发送的数据块...
Java网络教程 -Java网络TCP客户端套接字 Socket 类表示一个TCP客户端套接字。以下代码显示如何创建TCP客户端套接字:// Create S...
JavaFX教程 -JavaFX 选择框JavaFX框允许用户在几个选项之间快速选择。创建一个选择框我们可以使用ChoiceBox中的consturctors来创...
JavaFX教程 -JavaFX 进度显示器进度指示器以动态更改饼图的形式显示JavaFX中的操作进度。以下代码显示如何使用不确定值创建Progr...