线程安全问题-synchronized(方法)火车票卖票代码演示

Posted 名字真的很急用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全问题-synchronized(方法)火车票卖票代码演示相关的知识,希望对你有一定的参考价值。

同步方法。
同步方法就是把synchronized关键字加到方法上,
格式: 修饰符 synchronized 返回值类型 方法名 (方法参数){}
同步方法的锁对象是什么?
this

同步静态方法。
同步静态方法就是把synchronized关键字加到静态方法上,
格式: 修饰符 static synchronized 返回值类型 方法名 (方法参数){}
同步静态方法的锁对象是什么?
类名.class(反射机制)

下面代码演示火车票买票。

package threadtest;

public class sellTickets implements Runnable {
	
private int tickets =100;
//private static int tickets=100;
private Object obj = new Object();
private int x=0;
	public void run() {
		while(true) {
			if(x%2==0) {
				//synchronized (obj) {同步方法
				synchronized (this) {
					//synchronized (sellTickets.class) { 静态方法
					if(tickets>0) {
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println(Thread.currentThread().getName()+"正在卖票"+tickets+"张票");
						tickets--;
					}
				}
			}else {
				sellticket();
				x++;
			}
		}
	}
	//这是同步安全锁的一种方法。
//	private void sellticket() {
//		// TODO Auto-generated method stub
//		synchronized (obj) {
//			if(tickets>0) {
//				try {
//					Thread.sleep(100);
//				} catch (InterruptedException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//				System.out.println(Thread.currentThread().getName()+"正在卖票"+tickets+"张票");
//				tickets--;
//			}
//		}
//	}
	private synchronized void sellticket() {
		
		//private static synchronized void sellticket() {  使用静态方法同步安全锁
		// TODO Auto-generated method stub
		if(tickets>0) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"正在卖票"+tickets+"张票");
			tickets--;
		}
	}
           
}

测试类。

public class ontest {
	
	
	public static void main(String[] args) {
		
		sellTickets st = new sellTickets();
		
		Thread th1 = new Thread(st,"飞机");
		Thread th2 = new Thread(st,"高铁");
		Thread th3 = new Thread(st,"汽车");
		
		
		th1.start();
		th2.start();
		th3.start();
	}

}

结果如下
飞机正在卖票100张票
汽车正在卖票99张票
高铁正在卖票98张票
高铁正在卖票97张票
高铁正在卖票96张票
汽车正在卖票95张票
汽车正在卖票94张票
汽车正在卖票93张票
汽车正在卖票92张票
汽车正在卖票91张票
汽车正在卖票90张票
汽车正在卖票89张票
汽车正在卖票88张票
汽车正在卖票87张票
汽车正在卖票86张票
汽车正在卖票85张票
汽车正在卖票84张票
汽车正在卖票83张票
汽车正在卖票82张票
汽车正在卖票81张票
汽车正在卖票80张票
汽车正在卖票79张票
飞机正在卖票78张票
飞机正在卖票77张票
飞机正在卖票76张票
汽车正在卖票75张票
高铁正在卖票74张票
汽车正在卖票73张票
汽车正在卖票72张票
汽车正在卖票71张票
汽车正在卖票70张票
汽车正在卖票69张票
汽车正在卖票68张票
汽车正在卖票67张票
汽车正在卖票66张票
飞机正在卖票65张票
飞机正在卖票64张票
飞机正在卖票63张票
飞机正在卖票62张票
飞机正在卖票61张票
飞机正在卖票60张票
汽车正在卖票59张票
汽车正在卖票58张票
汽车正在卖票57张票
汽车正在卖票56张票
汽车正在卖票55张票
汽车正在卖票54张票
高铁正在卖票53张票
汽车正在卖票52张票
汽车正在卖票51张票
汽车正在卖票50张票
汽车正在卖票49张票
汽车正在卖票48张票
汽车正在卖票47张票
汽车正在卖票46张票
汽车正在卖票45张票
汽车正在卖票44张票
汽车正在卖票43张票
汽车正在卖票42张票
汽车正在卖票41张票
飞机正在卖票40张票
飞机正在卖票39张票
飞机正在卖票38张票
飞机正在卖票37张票
汽车正在卖票36张票
汽车正在卖票35张票
汽车正在卖票34张票
汽车正在卖票33张票
汽车正在卖票32张票
汽车正在卖票31张票
汽车正在卖票30张票
汽车正在卖票29张票
汽车正在卖票28张票
汽车正在卖票27张票
汽车正在卖票26张票
高铁正在卖票25张票
高铁正在卖票24张票
高铁正在卖票23张票
高铁正在卖票22张票
高铁正在卖票21张票
高铁正在卖票20张票
高铁正在卖票19张票
高铁正在卖票18张票
高铁正在卖票17张票
高铁正在卖票16张票
高铁正在卖票15张票
高铁正在卖票14张票
汽车正在卖票13张票
汽车正在卖票12张票
汽车正在卖票11张票
汽车正在卖票10张票
汽车正在卖票9张票
飞机正在卖票8张票
飞机正在卖票7张票
飞机正在卖票6张票
飞机正在卖票5张票
汽车正在卖票4张票
汽车正在卖票3张票
汽车正在卖票2张票
汽车正在卖票1张票

以上是关于线程安全问题-synchronized(方法)火车票卖票代码演示的主要内容,如果未能解决你的问题,请参考以下文章

Thread线程并发解决synchronized

java线程同步-synchronized

多线程—— synchronized 修饰符

java多线程核心技术——synchronized同步方法与synchronized同步快

synchronized同步方法

synchronized同步方法