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()方法。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值