多线程 Lock

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/S031302306/article/details/82016747

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();
	}

}

猜你喜欢

转载自blog.csdn.net/S031302306/article/details/82016747