java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
2023-09-14 08:57:14 时间
这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提:
* 1.必须要有两个以上的线程,才需要同步。
* 2.必须是多个线程使用同一个锁。
* 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码
那么我们要思考的地方有:1.知道我们写的哪些是多线程代码
2.明确共享数据
3.明确多线程运行的代码中哪些语句是操作共享数据的。、
4.要确保多个线程使用同一个锁。
下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完。
第一种写法:使用同步代码块的方式
class bank{ private int sum; Object obj = new Object();//对象锁 public void add(int money){ synchronized (obj) { sum +=money; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sum="+sum); } } }
第二种方法在函数上加synchronized:
class bank{ private int sum; //函数封装代码(加synchronized)==同步块封装代码 public synchronized void add(int money){ sum +=money; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("sum="+sum); } } class Cus implements Runnable{ private bank b = new bank(); @Override public void run() { for(int i=0;i<3;i++){ //System.out.println(Thread.currentThread().getName()); b.add(100); } } } public class BankDemo { public static void main(String[] args) { // TODO Auto-generated method stub Cus c1 = new Cus(); Thread t1 = new Thread(c1); Thread t2 = new Thread(c1); t1.start(); t2.start(); } }
总结:同步应该加到add方法上面,因为add方法被run方法调用,所以是线程代码,这里的sum是共享数据,add方法 里面 sum +=money;操作共享数据。这里用了在普通方法上面加syncronized代替同步代码块,这也叫做同步函数。那么同步函数用的锁是什么?我们下一节再接着讨论,多线程同步函数。
相关文章
- java集合介绍_java代码分析框架
- java解析xml方法_详解Java解析XML的四种方法
- java中打印数组的方法_Java数组方法–如何在Java中打印数组
- java中scanner意思_Java中的Scanner
- Java冒泡排序实现
- java环境_Java基础篇——环境配置
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java获取服务器路径_JAVA获取服务器路径的方法「建议收藏」
- java 构造器 构造方法_Java构造器(构造方法/constructor)
- 怎么使用Java 8 Stream将List(Object)转成List(Map(String, Object))?
- java算法刷题00——数据结构基础知识回顾
- java webservice接口开发教程_JAVA入门教程
- java使用itext为pdf文件设置密码保护详解编程语言
- java实现excel下载和上传的工具类详解编程语言
- java代码中在双引号里面添加双引号详解编程语言
- Java抽象类和接口的区别
- Linux下部署Java项目实践(linux部署java项目)
- Java程序更新MySQL记录的实践(java更新mysql)
- 时间设置Java中Redis设置过期时间的方法(redisjava过期)
- 类使用Java实现Redis中键值对的过期操作(redisjava过期)
- 策略设计高效的Redis Java过期策略(redisjava过期)
- Java轻松处理Redis缓存(java处理redis)
- _home让Linux下Java更有效:更新Java_Home(linux更改java)
- Oracle全面支持Java链技术构建数据库应用(java链oracle)
- Oracle数据库中运行Java程序的简易指南(oracle中写java)
- Java获取URL的内容
- 解决Java调用BAT批处理不弹出cmd窗口的方法分析