当前位置: 首页 > news >正文

【好程序员特训营】Java线程同步初探

对于同步,在具体的Java代码中需要完成以下两个操作:

把竞争访问的资源标识为private;

同步那些修改变量的代码,使用synchronized关键字同步方法火代码。


synchronized关键字智能标记费抽象方法,不能标记成员变量

为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支、存款等多个操作。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。

以下是代码:

public class Test {

	public static void main(String args[]){
		User u=new User("张三",100);
		MyThread t1=new MyThread("线程A",u,20);
		MyThread t2=new MyThread("线程B",u,20);
		MyThread t3=new MyThread("线程C",u,20);
		MyThread t4=new MyThread("线程D",u,20);
		MyThread t5=new MyThread("线程E",u,20);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		
}
	
static class MyThread extends Thread{
	private User u;
	private int y=0;
	MyThread (String name,User u,int y){
		super(name);
		this.u=u;
		this.y=y;
		
	}
	public void run(){
		u.oper(y);
	}
}
static class User{
	private String code;
	private int cash;
	User (String code,int cash){
		this.code=code;
		this.cash=cash;
	}
	public String getCode(){
		return code;
	}
	public void setCode(String code){
		this.code=code;
	}
	public synchronized void oper(int x){
		try{
			Thread.sleep(10L);
			this.cash+=x;
			System.out.println(Thread.currentThread().getName()+"运行结束,增加“"
					+x+"“,当前账户余额为:"+cash);
			
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	public String toString(){
		return "User{"+"code="+code+",cash="+cash+"}";
	
	}
}
}

关键点就在于
public synchronized void oper(int x){
同步了这个方法,只允许一个线程进行访问,因而避免错误的出现

代码已经验证过了,能够实现功能

相关文章:

  • 【好程序员特训营】Java中常用的排序方法
  • 【好程序员特训营】Java中随机数处理
  • 【好程序员特训营】IO常用流的功能及特性
  • 【好程序员特训营】Java类与对象
  • 【好程序员特训营】Java网络连接测试小例子
  • Unity4.6中修改RectTransform的宽度和高度
  • unity3D 动态导入FBX、obj模型
  • UL标签的padding与margin默认值
  • 一个让img居中居左居右的方法
  • 谷歌 CardBoard Unity开发基础
  • Unity使用Face++
  • Processing 用图片填充形状
  • Unity结合讯飞语音在线识别
  • Arduino控制L298N
  • Unity Mesh初探
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • docker-consul
  • Docker容器管理
  • echarts的各种常用效果展示
  • jdbc就是这么简单
  • Netty源码解析1-Buffer
  • 从伪并行的 Python 多线程说起
  • 基于axios的vue插件,让http请求更简单
  • 你真的知道 == 和 equals 的区别吗?
  • 算法-插入排序
  • 微服务入门【系列视频课程】
  • 小程序开发之路(一)
  • 小试R空间处理新库sf
  • 一个SAP顾问在美国的这些年
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 栈实现走出迷宫(C++)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # 飞书APP集成平台-数字化落地
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (27)4.8 习题课
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读40-45)图像描述1
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 物件導向與老子思想 (OO)
  • (转)socket Aio demo
  • (转)项目管理杂谈-我所期望的新人
  • (转载)利用webkit抓取动态网页和链接
  • ***通过什么方式***网吧
  • .Net Core 中间件验签
  • .NET Micro Framework初体验
  • .NET4.0并行计算技术基础(1)