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编程(三) 同步的两种不同实现方式的更多相关文章

  1. Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)

    Java中实现多线程的方法有两种: 继承Thread类和实现Runnable方法,并重写Run方法,然后调用start()方法启动线程.使用Runnable会比Thread要好很多,主要是以下三个原因 ...

  2. Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

  3. 【转】Java并发编程:同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

  4. 8、Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

  5. java 序列化 serialVersionUID 的作用 和 两种添加方式

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  6. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  7. kettle 多表全删全插同步数据 两种方案

    背景: 接到上级指示,要从外网某库把数据全部导入到内网,数据每天更新一次即可,大约几百万条数据,两个库结构一样,mysql的,两台数据库所在服务器都是windows server的,写个java接口实 ...

  8. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  9. Java中的ReentrantLock和synchronized两种锁定机制的对比

    问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...

随机推荐

  1. 使用DateLocaleConverter和SimpleDateFormat实现字符串转换成日期

    使用DateLocaleConverter: public static void change() { String birthday = "1990-12-32"; DateL ...

  2. LeetCode题目分类

    利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...

  3. 怎样用ZBrush中的Curves和Insert笔刷创建四肢

     之前的ZBrush教程给大家介绍了人体结构比例和肌肉走向,同时使用ZBrush®软件中的CuverTube笔刷为模型添加了颈部和手臂.使用InsertSphere笔刷添加腰部,本讲将继续使用Curv ...

  4. hdu-5904 LCIS(水题)

    题目链接: LCIS Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. 51nod-1661 1661 黑板上的游戏(组合游戏)

    题目链接: 1661 黑板上的游戏 Alice和Bob在黑板上玩一个游戏,黑板上写了n个正整数a1, a2, ..., an,游戏的规则是这样的:1. Alice占有先手主动权.2. 每个人可以选取一 ...

  6. POJ 1364 King --差分约束第一题

    题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...

  7. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  8. POJ 3481Double Queue Splay

    #include<stdio.h> #include<string.h> ; ],data[N],id[N],fa[N],size,root; void Rotate(int ...

  9. FMDB 使用方法

    优秀的第三方库,README 也是很优秀的,理解了 README,会对使用带来很多便利. ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目 ...

  10. 转载:有关SQL server connection Keep Alive 的FAQ(2)

    转: http://blogs.msdn.com/b/apgcdsd/archive/2012/05/18/sql-server-connection-keep-alive-faq-2.aspx 在下 ...