文档章节

线程安全问题

花开院蚂蚁
 花开院蚂蚁
发布于 2016/10/18 17:25
字数 1630
阅读 19
收藏 0

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
博文 24
码字总数 12501
作品 0
合肥
私信 提问

暂无文章

PCB设计-Allegro软件入门系列-allegro环境变量和快捷键

Allegro作为一款高速PCB设计的EDA软件,有完善的约束规则设计和信号完整性电源完整性仿真等各种专业工具深受电子行业从业者喜爱。 对于该软件来说,电子从业者接触最多的就是Allegro的画板功...

demyar
24分钟前
4
0
腾讯云存储

1、进入腾讯云平台,创建 2、进入配置查看域名 3、查看KEY参数 4、将2、3中的参数录入到cms后台 然后点测试按钮查看情况

迅睿CMS-PHP开源CMS程序
25分钟前
4
0
ES 6.x 版本 待验证的CURL命令查询操作

1. 查询数据 curl -H "Content-Type: application/json" -XGET http://elastic:123456@127.0.0.1:9200/alias1/_search -d '{"query": {"match_all": {}}}' 2. 添加数据 如果有不指定ID可以自......

coord
33分钟前
4
0
如何写好论文摘要:研究人员不得不知的小秘诀

我们为何要写摘要? 它的目的为何? 简而言之,摘要的目的就是简单的讨论这篇文章让读者更容易的了解这篇文。 它能在读者与作者之间搭起一条桥梁。当您搜索信息时,您无法一下阅读整篇文章,...

论文辅导员
36分钟前
4
0
移动端、PC端(前后台)、小程序常用的UI框架

移动端、PC端(前后台)、小程序常用的UI框架 1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youzan/vant 优点:用来做移...

jason_kiss
36分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部