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的更多相关文章
随机推荐
- ng-disabled的使用
1.适用范围 该指令适用于<input>, <select>,<button> 和 <textarea> 元素. 2.用法解析 ng-disabled ...
- 洛谷P5274 优化题(ccj)
洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...
- ajax异步请求分页显示
html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- MySQL中的索引提示Index Hint
MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...
- PAT 1067. 试密码(20)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过20的.不包含空格.Ta ...
- Hadoop “Name node is in safe mode” 错误解决方法
Hadoop 解除 "Name node is in safe mode" 运行hadoop程序时,有时候会报以下错误:org.apache.hadoop.dfs.SafeMode ...
- ShutIt:一个基于 Python 的 shell 自动化框架
ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...
- Integrate-And-Fire Models(转)
Integrate-And-Fire Models 基础知识 轴突:动作电位(电位差形成电流)=神经递质发放=脉冲产生树突或细胞体:神经递质的接受=产生内外膜电位差(电流产生)=接收脉冲脉冲编码:多采 ...
- LeetCode:二进制求和【67】
LeetCode:二进制求和[67] 题目描述 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11" ...
- Python基础知识补充(重要)-作用域、特殊语法
Python作用域 python代码内部块如if语句内声明变量,在if代码段后在调用此变量并未报如“undefinded name"此类错误,例子如下: if 1 == 1: name = ...