同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)
来源:互联网 发布:南京网络问政开发区 编辑:程序博客网 时间:2024/05/16 13:02
一、同步代码块经典实例:
1、需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。
2、目的:该程序是否有安全问题,如果有,如何解决?
3、如何找问题:
1)明确哪些代码是多线程运行代码。
2)明确共享数据。
3)明确多线程运行代码中哪些语句是操作共享数据的。
4、代码解决:
方式一:
方式二(正确方法):
package sram.thread;public class BankThread extends Thread{ static int money = 5000; public BankThread(){ } public BankThread(String name){ super(name); } public void run() { while(true){ synchronized("锁"){ if(money>0){ System.out.println(currentThread().getName()+ "取了1000元,还剩"+(money-1000)+"元"); money-=1000; } } } } public static void main(String args[]){ BankThread user1 = new BankThread("老公"); BankThread user2 = new BankThread("老婆"); user1.start(); user2.start(); }}
二、同步函数:
1、同步函数定义:同步函数就是使用synchronized修饰一个函数。
2、同步函数要注意的事项 :
1)如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。
a)非静态同步函数(锁不住):
使用形式一:
使用形式二:
b)静态同步函数:
图解:
2)同步函数的锁对象是固定的,不能由你来指定的。
3、同步代码块、同步函数对比(推荐使用: 同步代码块)。
原因:
1)同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。
2)同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了。
0 0
- 同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)
- 线程安全问题之线程同步机制(同步代码块)
- 线程安全问题(银行取钱问题)、同步代码块、同步方法
- java线程安全之同步函数和同步代码块
- 多线程(四)线程的同步之同步代码块
- java多线程㈡—线程安全问题(同步代码块or同步函数)
- 线程安全问题:同步代码块synchronized
- 使用同步代码块解决线程安全问题
- 线程安全问题(使用同步代码块)
- 线程、同步代码块、同步函数、死锁
- 线程同步代码块之交换输出
- 线程同步---同步代码块
- 线程同步 同步代码块
- 线程(6)--线程同步之同步方法和同步块
- 线程-同步代码块
- 多线程(四)线程的同步之线程安全问题
- 线程安全问题(使用同步函数)
- 线程同步---线程安全问题
- CodeForces 673D - Bear and Two Paths(构造)
- YUM源配置教程
- Statement、 PreparedStatement 、CallableStatement 区别和联系
- CefSharp53(二)屏蔽右键菜单
- 初次涉及Java领域,感觉到Java入门是好像没有C,C++入门快
- 同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)
- android adb常用的命令
- spring-day5
- 边学边玩:Ubuntu安装Pycharm
- 深入解析struts.xml配置的实现原理
- Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 1
- python中map和reduce函数的学习
- Retrofit2简单实例
- spring-day6