java中Lock类的使用

1.使用ReentrantLock类:

     private Lock ticklock=new ReentrantLock();
调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁。

范例:

public class MyThread{
    private Lock lock=new ReentrantLock();
    public void TestMethod(){
        lock.lock();         //得到对象锁
        for(int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+i);
        } 
        lock.unlock();        //释放对象锁
    }

}

2.使用ReentrantLock实现同步

以卖票为例:

class MyThread implements Runnable{
	private int ticket=10;
	private Lock lock=new ReentrantLock();
	@Override
	public void run() {
		for(int i=0;i<10;i++)
		{
			lock.lock();        //获取对象锁
			try {
				if(this.ticket>0)
				{
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.println(Thread.currentThread().getName()+"还有"+this.ticket--+"张票");
				}
			} finally {
				lock.unlock();       //释放对象锁
			}
		}
	}
}

测试代码:

public class Test1 {
	public static void main(String[] args) throws InterruptedException {
		MyThread myThread=new MyThread();
		Thread thread=new Thread(myThread,"黄牛A");
		Thread thread1=new Thread(myThread,"黄牛B");
		thread.start();
		thread1.start();
	}
}

打印结果:

 3.使用Condition实现等待/通知:

   关键字synchronized与wait()和notify()/notifyAll()方法结合可以实现等待/通知模式,类ReentratLock也可以实现同样的功能,借助于Conditiond对象。


class MyService
{
	private Lock lock=new ReentrantLock();    //创建Lock对象
	public Condition condition=lock.newCondition();    //创建Condition对象
	
	public void await()
	{
		try {
			lock.lock();
			System.out.println("await时间为:"+System.currentTimeMillis());
			condition.await();
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			lock.unlock();
		}
	}
	public void signal()
	{
		try {
			lock.lock();
			System.out.println("await时间为:"+System.currentTimeMillis());
			condition.await();
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			lock.unlock();
		}
	}
}
class MyThread extends Thread{
	private MyService myserice;
	
	public MyThread(MyService myserice) {
		super();
		this.myserice = myserice;
	}

	@Override
	public void run() {
		myserice.await();
	}
}
public class Test1 {
	public static void main(String[] args) throws InterruptedException {
	MyService myService=new MyService();
	MyThread myThread=new MyThread(myService);
	myThread.start();
	Thread.sleep(1000);
	myService.signal();
	}
}
		

运行结果:

会打印两条一样的时间。

在上述代码中:

Object类中的wait方法相当于Condition类中的await()方法。
Object类中的wait(long timeout)方法相当于Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当于Condition类中的signal方法。
Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。

 

<think>我们正在寻找JavaLock接口的所有实现Lock接口位于java.util.concurrent.locks包中。 根据Java标准库,Lock接口的常见实现包括: - ReentrantLock:可重入锁,是最常用的实现。 - ReentrantReadWriteLock.ReadLock:读写锁中的读锁。 - ReentrantReadWriteLock.WriteLock:读写锁中的写锁。 此外,还有一些其他库或框架可能提供了Lock接口的实现,但我们通常关注的是JDK自带的实现。 我们可以通过查看JDK源码或文档来确认。在JDK中,Lock接口的实现主要就是上述几个。 因此,我们可以列出: 1. java.util.concurrent.locks.ReentrantLock 2. java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock 3. java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock 注意:ReadLock和WriteLock是ReentrantReadWriteLock的两个内部,它们分别实现了Lock接口。 另外,在java.util.concurrent.locks包中,还有一个StampedLock,但它并没有直接实现Lock接口,而是提供了另一种锁机制。StampedLock内部有ReadWriteLock视图,但是它的读锁和写锁并不是直接实现Lock接口,而是通过asReadLock()和asWriteLock()方法返回Lock视图。但是,这些返回的锁视图实际上是StampedLock的内部,并且实现了Lock接口。所以,严格来说,StampedLock也提供了Lock接口的实现,但并不是StampedLock本身实现Lock,而是它的内部。 我们可以这样看: - StampedLock.asReadLock() 返回一个Lock - StampedLock.asWriteLock() 返回一个Lock 这些返回的Lock对象也是Lock接口的实现。 因此,我们可以将StampedLock的内部锁实现也加入列表。 总结,在JDK中,Lock接口的直接实现包括: 1. ReentrantLock 2. ReentrantReadWriteLock.ReadLock 3. ReentrantReadWriteLock.WriteLock 4. StampedLock的内部:StampedLock.ReadLockView 和 StampedLock.WriteLockView(这两个在JDK源码中是包私有的,所以我们在外部可能看不到,但通过StampedLock的方法返回的Lock对象就是这些的实例) 另外,我们还可以通过查看Lock接口的文档,在“All Known Implementing Classes”部分找到官方列出的实现。 根据Java 17的文档,Lock接口的已知实现有: - ReentrantLock - ReentrantReadWriteLock.ReadLock - ReentrantReadWriteLock.WriteLock 注意:StampedLock返回的锁视图并没有被列为Lock接口的已知实现,可能是因为它们是内部且没有公开。但事实上,它们实现了Lock接口。 因此,在回答中,我们可以列出以上三个主要实现,并补充说明StampedLock提供的锁视图也是实现,但通常我们使用Lock接口时,最常用的是ReentrantLock和ReentrantReadWriteLock的两个锁。 此外,还有一些第三方库可能提供了Lock接口的实现,例如Guava库或其他并发库,但这里我们只讨论JDK标准库。 所以,最终答案: JavaLock接口在标准库中的实现有: 1. ReentrantLock 2. ReentrantReadWriteLock.ReadLock 3. ReentrantReadWriteLock.WriteLock 另外,StampedLock通过asReadLock()和asWriteLock()方法提供了Lock接口的实现,但这些实现是StampedLock的内部。 我们可以通过代码示例来验证: 例如,使用ReentrantLock: ```java Lock lock = new ReentrantLock(); ``` 使用读写锁: ```java ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); Lock readLock = rwLock.readLock(); Lock writeLock = rwLock.writeLock(); ``` 使用StampedLock: ```java StampedLock stampedLock = new StampedLock(); Lock readLock = stampedLock.asReadLock(); Lock writeLock = stampedLock.asWriteLock(); ``` 因此,在标准库中,我们主要使用以上几种实现。 根据用户提供的引用,没有直接关于Lock实现的信息,但引用[3]提到了线程池和锁相关的问题,说明用户可能对并发编程感兴趣。 最后,我们按照要求生成相关问题。</think>### JavaLock接口的实现Java标准库(`java.util.concurrent.locks`包)中,`Lock`接口的主要实现如下: 1. **`ReentrantLock`** 最常用的可重入互斥锁,支持公平锁和非公平锁模式。 示例: ```java Lock lock = new ReentrantLock(); lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } ``` 2. **`ReentrantReadWriteLock.ReadLock`** 读写锁中的读锁,允许多个线程同时读取共享资源。 通过`ReentrantReadWriteLock.readLock()`获取。 3. **`ReentrantReadWriteLock.WriteLock`** 读写锁中的写锁,提供独占访问,与其他读/写锁互斥。 通过`ReentrantReadWriteLock.writeLock()`获取。 --- ### 其他相关实现 - **`StampedLock`的视图锁**: `StampedLock.asReadLock()`和`StampedLock.asWriteLock()`返回的锁对象也实现了`Lock`接口(Java 8+),但它们是`StampedLock`的内部封装,非独立。 - **第三方库实现**: 如Guava的`Monitor`、Netty的`ReentrantLock`扩展等(需额外依赖)。 --- ### 关键特性对比 | 实现 | 锁型 | 重入性 | 公平性选项 | 适用场景 | |-------------------------|--------------|--------|------------|------------------------| | `ReentrantLock` | 互斥锁 | 支持 | 支持 | 通用独占访问 | | `ReadLock` (读写锁) | 共享锁 | 支持 | 支持 | 读多写少的高并发场景 | | `WriteLock` (读写锁) | 互斥锁 | 支持 | 支持 | 写操作独占 | > **注意**: > 1. 所有`Lock`实现必须显式调用`unlock()`(通常放在`finally`块中),否则会导致死锁[^3]。 > 2. 读写锁(`ReentrantReadWriteLock`)适用于读操作远多于写操作的场景,否则可能因锁竞争降低性能[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值