线程的同步是保证多线程安全访问竞争资源的一种手段。
线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?
对于同步,在具体的Java代码中需要完成一下两个操作:
把竞争访问的资源标识为private;
同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。
当然这不是唯一控制并发安全的途径。
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, -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(); }
} public 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); }
} public 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; } /** * 业务方法 * @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(); } } @Override public String toString() { return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}'; }
}

输出结果:

如果去掉oper(int x)方法的synchronized修饰符,然后运行程序,结果如下:

很显然,上面的结果是错误的,导致错误的原因是多个线程并发访问了竞争资源u,并对u的属性做了改动。
可见同步的重要性。

转载于:https://www.cnblogs.com/wanyong-wy/p/7718029.html

Java线程:线程的同步-同步方法相关推荐

  1. java中同步_在Java中的方法同步和语句同步(块同步) - Break易站

    Java 多线程 线程主要通过共享对字段的访问和参考字段引用的对象进行通信.这种通信形式非常有效,但可能出现两种错误:线程干扰和内存一致性错误.需要一些同步构造来防止这些错误.以下示例显示了我们需要同 ...

  2. 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款

    synchronized的使用 大佬之所以叫大佬,就是因为他们即使一次看不懂,看二十遍也要看懂,再对萌新说:这个方法不是挺简单的嘛 1.同步方法 要注意的是,synchronized锁的不是方法,而是 ...

  3. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  4. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  5. Java多线程-线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...

  6. Java实现线程同步的方式

    1. synchronized关键字 synchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块. 重量级锁.包含两个特征:互斥性和可见性. synchron ...

  7. java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

    JAVA中线程在什么时候需要同步和互斥 关注:265  答案:6  mip版 解决时间 2021-01-27 08:10 提问者时光易老 2021-01-27 03:32 JAVA中线程在什么时候需要 ...

  8. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  9. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  10. 黑马毕向东Java课程笔记(day11):多线程(第一部分)——进程与线程+线程创建+线程安全与同步代码块+同步锁/死锁

    多线程好文:添加链接描述 锁机制:synchronized.Lock.Condition.volatile(原子性可见性)--参考添加链接描述 1.进程与线程概述   首先,对于CPU执行每一个程序, ...

最新文章

  1. 让程序员头疼的文档问题怎么破?试试活文档
  2. 解决html5 audio iphone,ipd,safari不能自动播放问题
  3. ubuntu mysql 更新_数据库应用(三): Ubuntu 下 MySQL添加、更新与删除数据
  4. 【C++】智能指针 Smart Pointer
  5. Java简介、安装及一些注意事项
  6. Apache JMeter--网站自动测试与性能测评
  7. 搭建一个redis高可用系统
  8. 使用VMWareWorkstation搭建学习环境
  9. 【flink】flink Source Coordinator Thread already exists driving actions Source Coordinator. Existing
  10. 《设计模式之禅》之——六大设计原则解读
  11. 2017-5-5/PHP实现负载均衡的加权轮询
  12. PHP利用GD库将微信小程序二维码和用户头像拼接且用户在微信服务号回复指定内容将拼接的二维码返回
  13. word2013+endnotex8参考文献导入
  14. 除了深度学习,你需要知道AI技术的23个方向
  15. python调用金山词霸的api
  16. 计算机应用基础上海交通大学出版社双色版,计算机应用基础模块化教程
  17. unity 中Line Renderser初始化有额外线段
  18. http://www.cnblogs.com/dolphin0520/p/3923167.html
  19. 【重要公告】包头市新型冠状病毒感染肺炎防控工作指挥部公告(2022年第4、5、6、7号)
  20. Python基础—简介、变量、运算符

热门文章

  1. java连接数据库hei_如何黑MySQL5数据库?(来自:http://superhei.blogbus.com)
  2. java api接口报500_应用程序编程接口API,我们来聊一聊这个熟悉的名词
  3. css初始化_CodeMirror项目【在线编辑器】--项目初始化
  4. 服务器维护以后只有辅助能进,通过服务器信息维护进行“半自动化”运维
  5. 什么是m叉树_国考临近考试了,感觉已经没有进步空间了,最后关头还有没有什么提成成绩的好方法?...
  6. undi是什么意思_undefined是什么意思啊
  7. 新建文件注释_PDF汇总注释原来如此简单
  8. gddr6速率_GDDR6 显存两年后问世:比 GDDR5X 更快,速率可达 16Gbps
  9. java 整型数组排序,java整型数组冒泡排序
  10. TypeError: Expected bytes错误解决方法