在多线程开发中,总会遇到多个在不同线程中的方法操作同一个数据,这样在不同线程中操作这个数据不同的顺序
或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就可以使用
synchronized关键字对一个方法来说,这个synchronized能保证所有调用这个方法的线程只有一个正在操作这个方法,
不会出现同时多个线程进入这个方法的情况,下面我们来一个例子说明这个情况。
首先是一个Account类,这个类模拟账户,提供增加工资和减少工资的方法,当然,这个方法是被synchronized控制
package com.bird.concursey.charpet2;
public class Account {
private double balance;
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public synchronized void addAmount(double amount) {
double temp = balance;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp += amount;
balance = temp;
}
public synchronized void subtractAmount(double amount) {
double temp = balance;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp -= amount;
balance = temp;
}
}
和保护的。
然后是两个模拟类,来模拟使用这个类来增加或者减少账户的余额
package com.bird.concursey.charpet2;
public class Bank implements Runnable {
private Account account;
public Bank(Account account) {
this.account = account;
}
@Override
public void run() {
for(int i = 0; i < 100; i++) {
account.subtractAmount(1000);
}
}
}
package com.bird.concursey.charpet2;
public class Company implements Runnable {
private Account account;
public Company(Account account) {
this.account = account;
}
@Override
public void run() {
for(int i = 0; i < 100; i++) {
account.addAmount(1000);
}
}
public static void main(String[] args) {
Account account = new Account();
account.setBalance(1000);
Company company = new Company(account);
Thread companyThread = new Thread(company);
Bank bank = new Bank(account);
Thread bankThread = new Thread(bank);
System.out.printf("Account : Initial Balance: %f\n",account.getBalance());
companyThread.start();
bankThread.start();
try {
companyThread.join();
bankThread.join();
System.out.printf("Account : Final Balance: %f\n",account.getBalance());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这样无论怎么使用都能得到正确的结果
分享到:
相关推荐
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...
一个多线程访问的同一个资源,java synchronized互斥锁的用法,android和此用法一致。
Java多线程synchronized关键字详解(六)共5页.pdf.zip
单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...
包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。
2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)synchronized关键字(2) 4. Java多线程学习(三)volatile关键字 5. Java多线程学习(四)等待/通知(wait/notify)机制 6. Java多...
1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...
synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。也就是说,在父类的方法声明上可以没有synchronized关键字,而在子类覆盖该方法时加上synchronized关键字。 注意:使用...
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable
本篇文章提供了20道高难度的Java多线程编程面试题及详细解析,旨在帮助开发者展示出卓越的并发编程能力。在当今高并发的应用场景下,对多线程编程的理解和应用是评估面试者的重要指标。通过这些高难度问题,您将全面...
主要介绍了Java 多线程synchronized关键字详解(六)的相关资料,需要的朋友可以参考下
Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
java基本教程之synchronized关键字java多线程教程共19页.pdf.zip
主要介绍了java多线程编程之Synchronized块同步方法,synchronized关键字又称同步锁,当方法执行完后,会自动释放锁锁,只有一个线程能进入此方法,看看下文中各种例子对synchronized的详细解释
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
主要介绍了Java多线程synchronized同步方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下