review38
Java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量。这时可能发生混乱。
所谓线程同步就是若干个线程都需要一个synchronized(同步)修饰的方法。
线程同步机制:当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到线程A使用完该synchronized方法。
public class Test04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bank bank = new Bank();
bank.setMoney(200);
Thread accountant, cashier;
accountant = new Thread(bank);
cashier = new Thread(bank);
accountant.setName("会计");
cashier.setName("出纳");
accountant.start();
cashier.start();
}
}
Bank.java
public class Bank implements Runnable {
int money = 200;
public void setMoney(int n)
{
money = n;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("会计"))
{
saveOrTake(300);
}
else if(Thread.currentThread().getName().equals("出纳"))
{
saveOrTake(150);
}
}
public synchronized void saveOrTake(int amount)
{
if(Thread.currentThread().getName().equals("会计"))
{
for(int i = 1; i <= 3; i++)
{
money = money + amount / 3;
System.out.println(Thread.currentThread().getName() + "存入"
+ amount/3 + ",帐上有" + money + "万,休息一会再存");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(Thread.currentThread().getName().equals("出纳"))
{
for(int i = 1; i <= 3; i++)
{
money = money - amount / 3;
System.out.println(Thread.currentThread().getName() + "取出" +
amount/3 + ",账上有" + money + "万,休息一会儿再取");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
运行结果如下所示:

review38的更多相关文章
随机推荐
- 20160916-3:mysql主从复制
一.什么是主从复制 将一个数据库节点的数据拷贝到一个或多个数据库节点(主节点—>从节点) 二.主从复制的原理 [简述]:将主节点上的变更操作存储到binlog,从节点建立了到主节点的复制关系后, ...
- Decimal fixed point and floating point arithmetic
decimal — Decimal fixed point and floating point arithmetic — Python 3.8.0a0 documentation https://d ...
- Markov Process
w Markov Process -- from Wolfram MathWorld http://mathworld.wolfram.com/MarkovProcess.html 谷歌背后的数学_ ...
- python系列二:python3基本数据类型
#标准数据类型——number(数字)a, b, c = 1, 2.2, "hello"print(a, end = ", ")print(b, end = & ...
- angular2表单初体验
1.创建movie模型. 最近对angular2比较感兴趣,跟着官网学习一段,练习了一个表单demo! src/app/movie.ts文件: export class Movie{ construc ...
- Vue.js之组件嵌套
Vue.js中组件嵌套有两种方式 第一种:注册全局组件 例如在components文件夹下新建一个User.vue组件,然后在main.js文件中注册全局组件 //注册全局组件 Vue.compone ...
- setdefault函数的用法及个人理解
setdefault函数的用法及理解 dict.setdefault(key, default=None) 功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于 ...
- Android基础入门教程
http://www.kancloud.cn/wizardforcel/w3school-android/100491
- 剑指offer 面试13题
面试13题: 题目:机器人的运动范围 题:地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子 ...
- Way to OpenSource
@1:Follow any instructions in the readme and make sure that you can configure and run the project on ...