java Thread编程(三) 同步的两种不同实现方式
1,创建需要同步的对象(方式一)
package concurrency;
public class Bank {
private double amount;
public Bank(double amount){
this.amount = amount;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public synchronized void addAmount(double money){
System.out.println("当前金额为: "+amount);
amount = amount + money;
System.out.println("增加"+money+"后的金额为:"+amount);
}
public synchronized void substract(double money){
System.out.println("当前金额为: "+amount);
amount = amount - money;
System.out.println("减少"+money+"后的金额为:"+amount);
}
}
2,创建两个线程对象
package concurrency;
public class AddMoneyThread implements Runnable{
private Bank bank;
private double money;
public AddMoneyThread(Bank bank,double money){
this.bank = bank;
this.money = money;
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
for(int i=0;i<10;i++){
bank.addAmount(money);
}
}
}
package concurrency;
public class SubstractMoneyThread implements Runnable{
private Bank bank;
private double money;
public SubstractMoneyThread(Bank bank,double money){
this.bank = bank;
this.money = money;
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
for(int i=0;i<10;i++){
bank.substract(money);
}
}
}
3,创建测试类
package concurrency;
public class ConcurrencyTest {
public static void main(String[] args) {
Bank bank = new Bank(1000);
AddMoneyThread addThread = new AddMoneyThread(bank, 10);
SubstractMoneyThread subThread = new SubstractMoneyThread(bank, 10);
Thread addT = new Thread(addThread);
Thread subT = new Thread(subThread);
addT.start();
subT.start();
}
}
4,创建需要同步的对象(方式二)
package concurrency;
public class Bank {
private double amount;
public Bank(double amount){
this.amount = amount;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public void addAmount(double money){
synchronized(this){
System.out.println("当前金额为: "+amount);
amount = amount + money;
System.out.println("增加"+money+"后的金额为:"+amount);
}
}
public void substract(double money){
synchronized(this){
System.out.println("当前金额为: "+amount);
amount = amount - money;
System.out.println("减少"+money+"后的金额为:"+amount);
}
}
}
1,synchronized作为一种同步手段,解决java多线程的执行有序性和内 存可见性
2,一个线程执行临界区代码过程如下:
(1) 获得同步锁
(2)清空工作内存
(3) 从主存拷贝变量副本到工作内存
(4) 对这些变量计算
(5) 将变量从工作内存写回到主存
(6) 释放锁
有几个问题不是很清楚。
我给方法上或者同步对象上加了锁,但是发现synchronized所包围的块是一个原子操作?不知道是什么原因?
个人的理解是:同步对象被加了锁,同步对象只能被一个线程访问。
该对象中的方法也只能被一个线程访问????
求指点!
java Thread编程(三) 同步的两种不同实现方式的更多相关文章
- Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)
Java中实现多线程的方法有两种: 继承Thread类和实现Runnable方法,并重写Run方法,然后调用start()方法启动线程.使用Runnable会比Thread要好很多,主要是以下三个原因 ...
- Java并发编程:同步容器
Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...
- 【转】Java并发编程:同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
- 8、Java并发编程:同步容器
Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...
- java 序列化 serialVersionUID 的作用 和 两种添加方式
serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...
- 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- kettle 多表全删全插同步数据 两种方案
背景: 接到上级指示,要从外网某库把数据全部导入到内网,数据每天更新一次即可,大约几百万条数据,两个库结构一样,mysql的,两台数据库所在服务器都是windows server的,写个java接口实 ...
- (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
- Java中的ReentrantLock和synchronized两种锁定机制的对比
问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...
随机推荐
- [转]移动web开发中meta标签作用
今天在尝试做移动页面的时候遇到了一个问题,<meta content="telephone=no,email=no" name="format-detection& ...
- 转: 借助GitHub托管你的项目代码
转自:http://www.cnblogs.com/edisonchou/p/5990875.html 备注: 原贴关于github使用说明,非常详细易懂.建议看原帖. 借助GitHub托管你的项目代 ...
- [Android Studio] Android studio 多渠道打包(超简洁版)
[Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...
- JavaScript---基本语法
字符串方法:str.lengthstr.charAt(i):取字符串中的某一个;str.indexOf('e');找第一个出现的位置;找不到返回-1;str.lastIndexOf('e'):找最后一 ...
- Entity Framework版本历史概览
转自:http://www.cnblogs.com/fecktty2013/archive/2014/09/26/entityframework-overview.html EF版本 .net fra ...
- Implement Stack using Queues
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- Redis做消息队列文章两篇
介绍:http://www.cnblogs.com/lhfcws/p/3732535.html 具体做法:http://shift-alt-ctrl.iteye.com/blog/1867454 另外 ...
- 实战 SQL Server 2008 数据库误删除数据的恢复
SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery m ...
- 从0开始学Java——JSP&Servlet——如何在Eclipse中配置Web容器为tomcat
windows- >Preferences -> Server->runtime Envirement ->Add 点击下一步,然后按照如下设置:
- LeetCode:Single Number II
题目地址:here 题目大意:一个整数数组中,只有一个数出现一次,其余数都出现3次,在O(n)时间,O(1)空间内找到这个出现一次的数 对于”只有一个数出现一次,其余数出现2次“的情况,很简单,只要把 ...