Java如何实现线程同步?线程同步的方法和反面教材
发布时间:2023-08-12 13:01:47
Java线程同步是保证多线程状态下安全访问竞争资源的一种编程手段,但线程的同步在Java多线程编程中算是一个比较难的难点,很多开发者甚至都不知道什么是竞争资源,也不知道时候需要进行线程同步,当然这是没有明确答案的,一些原则问题还是要考虑。
Java如何实现线程同步?
对于同步,在具体的Java代码中需要完成一下两个操作:
1、把竞争访问的资源标识为private;
2、同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。
当然这不是唯一控制并发安全的途径。
synchronized 关键字使用说明
synchronized 只能标记非抽象的方法,不能标识成员变量。
为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支、存款等多个操作。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。
01/**
02* Java线程:线程的同步
03*
04* @author leizhimin 2009-11-4 11:23:32
05*/
06public class Test {
07public static void main(String[] args) {
08User u = new User("张三", 100);
09MyThread t1 = new MyThread("线程A", u, 20);
10MyThread t2 = new MyThread("线程B", u, -60);
11MyThread t3 = new MyThread("线程C", u, -80);
12MyThread t4 = new MyThread("线程D", u, -30);
13MyThread t5 = new MyThread("线程E", u, 32);
14MyThread t6 = new MyThread("线程F", u, 21);
15t1.start();
16t2.start();
17t3.start();
18t4.start();
19t5.start();
20t6.start();
21}
22}
23class MyThread extends Thread {
24private User u;
25private int y = 0;
26MyThread(String name, User u, int y) {
27super(name);
28this.u = u;
29this.y = y;
30}
31public void run() {
32u.oper(y);
33}
34}
35class User {
36private String code;
37private int cash;
38User(String code, int cash) {
39this.code = code;
40this.cash = cash;
41}
42public String getCode() {
43return code;
44}
45public void setCode(String code) {
46this.code = code;
47}
48/**
49* 业务方法
50* @param x 添加x万元
51*/
52public synchronized void oper(int x) {
53try {
54Thread.sleep(10L);
55this.cash += x;
56System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);
57Thread.sleep(10L);
58} catch (InterruptedException e) {
59e.printStackTrace();
60}
61}
62@Override
63public String toString() {
64return "User{" +
65"code='" + code + '\'' +
66", cash=" + cash +
67'}';
68}
69}
复制代码
/*** Java线程:线程的同步** @author leizhimin 2009-11-4 11:23:32*/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, -60);MyThread t3 = new MyThread("线程C", u, -80);MyThread t4 = new MyThread("线程D", u, -30);MyThread t5 = new MyThread("线程E", u, 32);MyThread t6 = new MyThread("线程F", u, 21);t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();}}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);}}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;}/*** 业务方法* @param x 添加x万元*/public synchronized void oper(int x) {try {Thread.sleep(10L);this.cash += x;System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);Thread.sleep(10L);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String toString() {return "User{" +"code='" + code + '\'' +", cash=" + cash +'}';}}


猜你喜欢
- 部分电脑改装其他版本Windows 8后,在一键恢复未被破坏的情况下,需要重新备份系统。若直接进行备份,Windows系统下的重置及恢复功能
- 我们在日常办公应用中,经常会碰到这样的问题,如果换了台电脑,或是重装系统以后,之前的WORD文档打开以后,设置好的艺术字体就会自动为成宋体。
- 360浏览器中的收藏栏尽管给用户快速查看收藏夹中的站点提供了便利,但也在一定程度上影响了用户的使用体验。那么,360浏览器中的收藏栏该怎么隐
- 有win7系统用户在添加删除程序中看到一个不知明软件BLD Base Service,按字面意义来看是一个数据服务,其实它是一款推广统计软件
- 不知道win8兼容不兼容XP.我们看一下为了实现更好的兼容性,Windows 7发布时微软曾为大家带来了Windows XP Mode,也就
- 近来有不少升级了Win10 1909系统的用户反映,原本深色的系统任务栏因为莫名的原因突然便成了白色。那么,Win10 1909系统任务栏变
- 在使用操作系统的时候,需要安装驱动程序保证电脑的正常运行,但是还有很多朋友不清楚安装的驱动程序在哪。一般情况下在C盘的drivers文件夹就
- 自定义自动替换内容使用自动更正选项中自动替换功能,可以自定义新的替换对,提高输入效率。步骤如下:1.打开自动更正选项菜单,位置为:选项→校对
- Excel2007工作表中的每一列都有固定的宽度,默认值为8.38磅,因此必须有一些单元格的内容超过该宽度。在这种情况下,你应该怎么做?加宽
- 一到一个新学期开学,学校教务处应该是最忙的,又要做这个,又到做那个,其中编织课程表也是一件比较头疼的事情,因为一所学校课程表往往有很多的形式
- 当我们一段时间内没有使用电脑的话,显示器就会自动熄屏,这样就比较节省电源,不过有时候我们关电脑可能会很匆忙而不小心忘记关显示器,这样就很浪费
- Excel中经常需要使用到查找功能进行查找数据,查找功能具体该如何使用呢?下面是由小编分享的excel表格使用内容查找功能的教程,以供大家阅
- KOOK也就是原开黑啦是一款很有意思的语音聊天软件,有很多小伙伴都在使用KOOK来进行游戏语音,不过有小伙伴在使用KOOK的时候画面会出现掉
- 第十一,选定当前活动单元格区域比如,咱们需要给A1:C18单元格区域加上边框,首先得选中这些单元格。除了用鼠标拖动选择之外,还可以使用下面的
- 电脑双击桌面图标打不开软件怎么办?鼠标双击桌面图标没有任何反应,打不开软件该如何解决?本文就给大家介绍一下电脑桌面图标双击后没有反应无法运行
- Win10创造者更新最新预览版15025的官方镜像,下文小编就为大家带来官方ISO镜像下载地址,一起看看吧2月4日消息 微软正式开
- 不知道大家在使用Word的时候不知道有没有碰到在写的这个文档中存在空白区域但无法输入文字的情况呢?明明看着这块区域是空白的却无法输入文字,真
- 当在单元格中输入系统可识别的时间和日期型数据时,单元格的格式就会自动转换为相应的“时间”或者“日期”格式,而不需要专门设置。在单元格中输入的
- 苹果发布了iOS 15和iPadOS 15的第四个测试版,对软件更新中的新功能进行了额外的改进。在这些测试版中,Apple 对 Safari
- 今天为大家分享Mac os常用功能,让更多喜爱的朋友能快速的玩转MAC OS习惯会Windows系统的朋友,炫丽的MAC OS系统,是每位追