섹션 6 잠금 동기화 잠금

잠금 표시 잠금

⚫ Java 5.0 이전에는 공유 객체에 대한 액세스를 조정하는 데 사용할 수 있는 유일한 메커니즘이 동기화되고 휘발성이었습니다. Java 5.0 이후에 새로운 메커니즘이 일부 추가되었지만 내장 잠금을 대체하는 방법이 아니라 내장 잠금이 적용되지 않을 때 선택적 고급 기능으로 사용됩니다.
⚫ ReentrantLock은 잠금 인터페이스를 구현하고 동기화와 동일한 상호 배제 및 메모리 가시성을 제공합니다. 그러나 동기화에 비해 잠금 처리에 더 높은 유연성을 제공합니다.

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

/*
 * 一、用于解决多线程安全问题的方式:
 * 
 * synchronized:隐式锁
 * 1. 同步代码块
 * 
 * 2. 同步方法
 * 
 * jdk 1.5 后:
 * 3. 同步锁 Lock
 * 注意:是一个显示锁,需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁
 */
public class TestLock {
    
    
	
	public static void main(String[] args) {
    
    
		Ticket ticket = new Ticket();
		
		new Thread(ticket, "1号窗口").start();
		new Thread(ticket, "2号窗口").start();
		new Thread(ticket, "3号窗口").start();
	}

}

class Ticket implements Runnable{
    
    
	
	private int tick = 100;
	
	private Lock lock = new ReentrantLock();

	@Override
	public void run() {
    
    
		while(true){
    
    
			
			lock.lock(); //上锁
			
			try{
    
    
				if(tick > 0){
    
    
					try {
    
    
						Thread.sleep(200);
					} catch (InterruptedException e) {
    
    
					}
					
					System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
				}
			}finally{
    
    
				lock.unlock(); //释放锁
			}
		}
	}
	
}

Guess you like

Origin blog.csdn.net/m0_37294838/article/details/127683858