java多线程 同步-金沙1005

java多线程 同步_java 异步线程1.不安全的买票//不安全的买票 //线程不安全,有负数或者多人买到同一张票publicclassunsafebuyticket{ publicstaticvoidmain(string[]args){ buyticketbuyticket=newbuyticket(); newthread(buyticket,”苦逼的我”).start(); newthread(buyticket,”牛逼的你们”).start(); newthread(buytic

//不安全的买票
	//线程不安全,有负数或者多人买到同一张票
public class unsafebuyticket { 
   
	public static void main(string[] args) { 
   
		buyticket buyticket = new buyticket();
		new thread(buyticket,"苦逼的我").start();
		new thread(buyticket,"牛逼的你们").start();
		new thread(buyticket,"可恶的黄牛党").start();
	}
}
class buyticket implements runnable{ 
   
	//票数
	private int num = 10;
	private boolean flag = true;//判断是否停止线程 thread的stop已经废弃不建议使用
	@override
	public void run() { 
   
		//买票
		while (flag){ 
   
			buy();
		}
	}
	public void buy(){ 
   
		//判断是否有票
		if(num<=0){ 
   
			flag = false;
			return ;
		}
		try { 
   
			//模拟延时(放大问题的发生性)
			thread.sleep(100);
		} catch (interruptedexception e) { 
   
			e.printstacktrace();
		}
		//买票
		system.out.println(thread.currentthread().getname()"买到了第"num--"票");
	}
}
java多线程 同步_java 异步线程

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活clion
datagrip dataspell
dotcover dotmemory
dottrace goland
phpstorm pycharm
resharper reshac
rider rubymine
webstorm 全家桶

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方法:通过关键字synchronized来设置同步锁 在buy()方法前面添加synchronized关键字来锁定这个方法

public synchronized void buy(){ 
   
	//判断是否有票
	if(num<=0){ 
   
		flag = false;
		return ;
	}
	try { 
   
		//模拟延时(放大问题的发生性)
		thread.sleep(100);
	} catch (interruptedexception e) { 
   
		e.printstacktrace();
	}
	//买票
	system.out.println(thread.currentthread().getname()"买到了第"num--"票");
}

在这里插入图片描述

如上图添加了synchronized关键字后就避免了多人抢到同一张票的情况,也避免了在没有票的情况下继续出票的情况

//不安全的取钱
//两个人去银行取钱,账户
public class unsafebank { 

public static void main(string[] args) { 

account account = new account(100, "结婚基金");
drawing you = new drawing(account, 50, "你");
drawing grilfriend = new drawing(account, 100, "grilfriend");
grilfriend.start();
you.start();
}
}
//账户
class account{ 

int money;//余额
string name;//卡名称
public account(int money, string name) { 

this.money = money;
this.name = name;
}
}
//银行:模拟取钱
class  drawing extends thread{ 

account account;//账户
int drawingmoney;//取多少钱
int nowmoney;//现在手里有多少钱
public drawing(account account,int drawingmoney,string name){ 

super(name);
this.account = account;
this.drawingmoney = drawingmoney;
}
@override
public void run() { 

//判断账户里面有没有钱
if(account.money-drawingmoney<0){ 

system.out.println(thread.currentthread().getname()"钱不够了,取不了");
return;
}
//sleep 放大问题的发生性
try { 

thread.sleep(1000);
} catch (interruptedexception e) { 

e.printstacktrace();
}
//卡内余额 = 余额 - 你取的钱
account.money = account.money - drawingmoney;
//你手上的钱
nowmoney = nowmoney  drawingmoney;
system.out.println(account.name "余额为:"account.money);
//hread.currentthread().getname() = this.getname();
system.out.println(this.getname()"手里的钱"nowmoney);
}
}

在这里插入图片描述

上述的问题就是你去50万,你老婆去100万,结果银行还倒贴了50万

解决方法:给银行账户添加锁 synchronized(account)

@override
public void run() { 

synchronized (account){ 

//判断账户里面有没有钱
if(account.money-drawingmoney<0){ 

system.out.println(thread.currentthread().getname()"钱不够了,取不了");
return;
}
//sleep 放大问题的发生性
try { 

thread.sleep(1000);
} catch (interruptedexception e) { 

e.printstacktrace();
}
//卡内余额 = 余额 - 你取的钱
account.money = account.money - drawingmoney;
//你手上的钱
nowmoney = nowmoney  drawingmoney;
system.out.println(account.name "余额为:"account.money);
//hread.currentthread().getname() = this.getname();
system.out.println(this.getname()"手里的钱"nowmoney);
}
}
只要有一个人取完后另一个人就会因为余额不足取不了,保证了线程的安全

在这里插入图片描述

js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/141799.html

(0)

相关推荐

  • 数据类面试题_数据仓库面试题强类型语言 要求变量的使用严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 java 的数控类型分为两大类 基本类型(primitive type) 引用类型(reference type)

  • html5期末考核大作业 基于html css javascript仿王者荣耀金沙1005首页 游戏网站开发 游戏金沙1005官网设计与实现[通俗易懂]🎮游戏金沙1005官网、⛹️游戏网站、🕹️电竞游戏、🎴游戏介绍、等网站的设计与制作。⭐网页中包含:div css、鼠标滑过特效、table、导航栏效果、banner、表单、二级三级页面等,视频音频元素,同时设计了logo(源文件),基本期末作业所需的知识点全覆盖。🏅一套a 的网页应该包含(具体可根据个人要求而定)📔网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。📓网站程序方面:计划采用最新的网页编程语言html5 css3 js程序语言完成网站的功能设计。并确保……

    2022年12月18日
  • eclipse新建测试类_eclipse ide for java developersjava自动化测试之开发工具eclipse安装配置一、eclipse下载下载地址:[http://www.eclipse.org/downloads/](http://www.eclipse.org/downloads/)打开连接后,显示如下:选择eclipseide2021-12下载二、安装选择选择下图第二个安装:上图中java11 vm选在我们本地安装的jdk目录,不然下载会非常慢。三、安装成功安装成功后,选择namespace路径,就可以打开eclipse了。..

  • java接口的基础语法(interface)(超详细!)[亲测有效]1、接口也是一种“引用数据类型”。编译之后也是一个class字节码文件。2、接口是完全抽象的(无法实例化)。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。3、接口怎么定义,语法是什么?[修饰符列表]interface接口名{}4、接口支持多继承,一个接口可以继承多个接口。5、接口中只包含两部分内容:一部分是:常量。一部分是:抽象方法。接口中没有其它内容了。只有以上两部分。6、接口中所有的元素都是public修饰的。(都是公开的。)7、接口中的抽象方法定义时:pub

  • 最全面的44个java 性能调优细节我认为,代码优化的最重要的作用应该是:避免未知的错误。在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是一个非常小的原因。

  • java调用api_java程序实例importjava.util.linkedlist;importjava.util.list;importjava.util.map;importjava.util.vector;importjavax.xml.namespace.qname;importorg.apache.axis.client.call;importorg.apache.axis.client.service…

  • oracle查询空表_oracle数据库文档curl命令:curl-i-xgethttp://locahost:29976:8001/apisjava代码:publicstaticvoidlistapitest()throwsexception{closeablehttpclientclient=httpclients.createdefault();stringurl=”http://192.168.1….

  • es2021 中对 javascript 的新增和改进
    es2021 中对 javascript 的新增和改进 1、 replaceall – 全部替换 js 默认的 replace 方法仅替换字符串中一个模式的第一个实例,要全局替换,你需要自己写正则,因此 es2021 带来了全新的 replaceall 方法。 “hello”.replaceall( …

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图