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. 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx

    Before the invention of book-printing, it was very hard to make a copy of a book. All the contents h ...

  2. 【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取

    打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码, ...

  3. codeforces 577B B. Modulo Sum(水题)

    题目链接: B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. fireworks将图片变为透明色

    如果是新建的图片,只要把画布背景设置成透明,图片完成后保存为GIF格式即可: 如果是已经存在的图片,用Fireworks将图片打开,然后按Ctrl+Shift+X,在弹出界面中格式选择为GIF.在右边 ...

  5. yepnope初体验

    真是一个百花齐放的项目,在熟悉代码的过程中,看到各种前端.后端技术,这回又冒出一个yepnope的东东,搜索了一下,不是什么新技术,打开官方网站,已经弃用的通知非常醒目,但仍提供相关文档在github ...

  6. android camera setParameters failed 类问题分析总结

    在 monkey test 测试中出现了一例 RuntimeException ,即 setParameters failed. LOG显示为:09-01 18:47:17.348 15656 156 ...

  7. How to configure SRTM elevations in WorldWind WMS

    In this thread I will try to explain how to serve SRTM elevations using NASA WorldWind WMS. ! Import ...

  8. php基础29:打开目录

    <?php //1.打开一个目录 $dir = opendir("E:\AppServ\www\php"); //读取目录,使用一个循环来读出 while (!!$file= ...

  9. Dottrace跟踪代码执行时间

    当自己程序遇到性能问题,比如请求反应缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过长,然后再分析应该怎样解决 ...

  10. pandas 练习

    from pandas import Series, DataFrame # Series接收list或dict作为一维数据 #两个属性:values, index #① s1 = Series([4 ...