Java多线程锁定

前言

利用多线程编程虽然能极大地提升运行效率,但是多线程本身的不稳定也会带来一系列的问题,其中最经典莫过于售票问题;这时就需要人为地加以限制和干涉已解决问题,譬如今日之主题——锁定。

锁定是我们在多线程中用来解决售票问题的工具,它的作用机制是将业务代码上锁;锁定后的区间同一时间只能允许一个线程进入运行,在该线程运行结束之前,其余线程均不得进入,只能在区间外等待。

实现

锁的实现在Java中有三种实现方式,以下将逐一展示。

方法一

利用Java提供的lock锁进行锁定

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

class MyThread extends Thread {
	private static int num = 1;
	private static Lock lock = new ReentrantLock();

	public MyThread(String s) {
		this.setName(s);
	}

	public void run() {
		while(true) {
			lock.lock();
				if(num < 31) {
					System.out.println(this.getName() + "售出第" + num + "张票");
					num++;
				}
			lock.unlock();
		}
	}
}

方法二

利用syncronized方法进行锁定。

class MyThread extends Thread {
	private static int num = 1;

	public MyThread(String s) {
		this.setName(s);
	}

	public void run() {
		while(true) {
			synchronized(MyThread.class) {
				if(num < 31) {
					System.out.println(this.getName() + "售出第" + num + "张票");
					num++;
				}
			}
		}
	}
}

注意

synchronized方法需要一个公共对象作为“锁头”。

方法三

同步方法实现

class MyThread extends Thread {
	private static int num = 1;

	public MyThread(String s) {
		this.setName(s);
	}

	public void run() {
		while(true) {
			if(methood())	break;
		}
	}
	private synchronized boolean methood() {
		if(num  > 30)	return true;
		System.out.println(this.getName() + "售出第" + num + "张票");
		num++;
		return false;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值