线程安全问题

1. 


class Out extends Thread
{
	String name;
	static int num =50;
	public Out(String name) {
		this.name = name;
	//	super(name);
	}
	public void run()
	{
		while(num>0)
		{
			System.out.println(name+ "卖出了" +num+"号票...");
			num--;
		}
		System.out.println(name+"已经卖完了");
	}
}

public class MaiPIao {
	public static void main(String[] args) 
	{
		Out o1 = new Out("窗口1"); 
		Out o2 = new Out("窗口2"); 
		Out o3 = new Out("窗口3"); 
		o1.start();
		o2.start();
		o3.start();
	}
}
窗口3卖出了50号票...
窗口2卖出了50号票...
窗口1卖出了50号票...
窗口2卖出了48号票...
窗口3卖出了49号票...
窗口2卖出了46号票...
窗口1卖出了47号票...
窗口2卖出了44号票...
窗口3卖出了45号票...
窗口2卖出了42号票...
窗口1卖出了43号票...
窗口2卖出了40号票...
窗口3卖出了41号票...
窗口2卖出了38号票...
窗口1卖出了39号票...
窗口2卖出了36号票...
窗口3卖出了37号票...
窗口2卖出了34号票...
窗口1卖出了35号票...
窗口2卖出了32号票...
窗口3卖出了33号票...
窗口2卖出了30号票...
窗口1卖出了31号票...
窗口2卖出了28号票...
窗口3卖出了29号票...
窗口2卖出了26号票...
窗口1卖出了27号票...
窗口2卖出了24号票...
窗口3卖出了25号票...
窗口2卖出了22号票...
窗口1卖出了23号票...
窗口2卖出了20号票...
窗口3卖出了21号票...
窗口2卖出了18号票...
窗口1卖出了19号票...
窗口2卖出了16号票...
窗口3卖出了17号票...
窗口2卖出了14号票...
窗口1卖出了15号票...
窗口2卖出了12号票...
窗口3卖出了13号票...
窗口2卖出了10号票...
窗口1卖出了11号票...
窗口2卖出了8号票...
窗口3卖出了9号票...
窗口2卖出了6号票...
窗口1卖出了7号票...
窗口2卖出了4号票...
窗口3卖出了5号票...
窗口2卖出了2号票...
窗口1卖出了3号票...
窗口2已经卖完了
窗口3卖出了1号票...
窗口1已经卖完了
窗口3已经卖完了

2.解决方法


class Out extends Thread
{
	static int num = 50;
	static Object o = new Object(); //这边也是static 多线程的锁对象必须是唯一共享的
	public Out(String name) 
	{
		super(name);
	}
	public void run()
	{
		while(true)
		{
			synchronized(o) //synchronized("锁") 锁对象可以是任意的对象,
			{
				if(num>0)
				{
					//System.out.println(name+ "卖出了" +num+"号票...");
					System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
					num--;
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				else
				{
					System.out.println(Thread.currentThread().getName()+"已经卖完了");
					break;
				}
			}
		}
	}
}

public class MaiPIao {
	public static void main(String[] args) 
	{
		Out o1 = new Out("窗口1"); 
		Out o2 = new Out("窗口2"); 
		Out o3 = new Out("窗口3"); 
		o1.start();
		o2.start();
		o3.start();
	}
}
窗口1售出了第50号票
窗口1售出了第49号票
窗口1售出了第48号票
窗口2售出了第47号票
窗口3售出了第46号票
窗口2售出了第45号票
窗口2售出了第44号票
窗口1售出了第43号票
窗口2售出了第42号票
窗口2售出了第41号票
窗口2售出了第40号票
窗口3售出了第39号票
窗口2售出了第38号票
窗口2售出了第37号票
窗口2售出了第36号票
窗口2售出了第35号票
窗口1售出了第34号票
窗口1售出了第33号票
窗口2售出了第32号票
窗口3售出了第31号票
窗口3售出了第30号票
窗口2售出了第29号票
窗口1售出了第28号票
窗口2售出了第27号票
窗口2售出了第26号票
窗口3售出了第25号票
窗口2售出了第24号票
窗口1售出了第23号票
窗口2售出了第22号票
窗口2售出了第21号票
窗口3售出了第20号票
窗口2售出了第19号票
窗口2售出了第18号票
窗口1售出了第17号票
窗口1售出了第16号票
窗口1售出了第15号票
窗口1售出了第14号票
窗口2售出了第13号票
窗口3售出了第12号票
窗口2售出了第11号票
窗口1售出了第10号票
窗口1售出了第9号票
窗口1售出了第8号票
窗口2售出了第7号票
窗口3售出了第6号票
窗口3售出了第5号票
窗口2售出了第4号票
窗口2售出了第3号票
窗口1售出了第2号票
窗口2售出了第1号票
窗口2已经卖完了
窗口3已经卖完了
窗口1已经卖完了

3.自定义线程的另一种方法

/*
 * 1.自定义一个类实现Runnable接口
 * 2.实现Runnable接口的run方法,自定义线程的任务放在run方法中
 * 3.创建Runnable实现类对象
 * 4.创建Thread对象,并把Runnable的对象作为实参传递给,构造函数
 * 5.调用Thread的run方法开启一个进程
 * */


public class DiyXiancheng2 implements Runnable
{
	@Override
	public void run() 
	{
		for(int i=0;i<50;i++)
		{
			System.out.println(Thread.currentThread().getName()+": "+i);
		}
		
	}
	public static void main(String[] args)	
	{
		DiyXiancheng2 d = new DiyXiancheng2();
		Thread t = new Thread(d,"狗娃");
		t.start();
		for(int i=0;i<50;i++)
		{
			System.out.println("main: "+i);
		}
		
	}
}
main: 0
狗娃: 0
main: 1
狗娃: 1
main: 2
狗娃: 2
main: 3
狗娃: 3
main: 4
狗娃: 4
main: 5
狗娃: 5
main: 6
狗娃: 6
main: 7
狗娃: 7
main: 8
狗娃: 8
main: 9
狗娃: 9
main: 10
狗娃: 10
main: 11
狗娃: 11
main: 12
狗娃: 12
main: 13
狗娃: 13
main: 14
狗娃: 14
main: 15
狗娃: 15
main: 16
狗娃: 16
main: 17
狗娃: 17
main: 18
狗娃: 18
main: 19
狗娃: 19
main: 20
狗娃: 20
狗娃: 21
狗娃: 22
狗娃: 23
狗娃: 24
main: 21
狗娃: 25
main: 22
狗娃: 26
main: 23
main: 24
main: 25
main: 26
狗娃: 27
main: 27
main: 28
main: 29
狗娃: 28
main: 30
狗娃: 29
main: 31
狗娃: 30
main: 32
狗娃: 31
main: 33
狗娃: 32
main: 34
狗娃: 33
main: 35
狗娃: 34
main: 36
main: 37
main: 38
main: 39
狗娃: 35
main: 40
狗娃: 36
main: 41
狗娃: 37
main: 42
狗娃: 38
main: 43
狗娃: 39
main: 44
狗娃: 40
main: 45
狗娃: 41
main: 46
狗娃: 42
main: 47
狗娃: 43
main: 48
狗娃: 44
main: 49
狗娃: 45
狗娃: 46
狗娃: 47
狗娃: 48
狗娃: 49

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值