欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程 Lock

程序员文章站 2022-03-09 19:00:26
...

SellTickets.java

package cn.itcast.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SellTickets implements Runnable {
	private int tickets = 100;
	
	//定义锁对象
	private Lock lock = new ReentrantLock();

	@Override
	public void run() {
		while(true){
			try{
				//加锁
				lock.lock();
				if(tickets>0){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+
							"正在出售" + (tickets--) + "张票");
				}
			}finally{
				//释放锁对象
				lock.unlock();
			}
			
		}
		
	}	
	
}

SellTicketsLockTest.java

package cn.itcast.lock;
/**
 * 虽然我们可以理解同步代码块和同步方法的锁对象,但是我们并没有直接看到在哪里加上了锁,
 * 在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
 * Lock:
 * 		void lock():获取锁
 * 		void unlock():释放锁
 * 
 * ReentrantLock是Lock的实现类。
 * 
 */
public class SellTicketsLockTest {
	public static void main(String[] args) {
		//创建资源对象
		SellTickets st = new SellTickets();
		
		//创建三个窗口的线程
		Thread t1 = new Thread(st,"窗口1");
		Thread t2 = new Thread(st,"窗口2");
		Thread t3 = new Thread(st,"窗口3");
		
		//启动线程
		t1.start();
		t2.start();
		t3.start();
	}

}

 

相关标签: Lock