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/ ...
随机推荐
- 使用DateLocaleConverter和SimpleDateFormat实现字符串转换成日期
使用DateLocaleConverter: public static void change() { String birthday = "1990-12-32"; DateL ...
- Java 开发环境部署
1.下载Java开发环境工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后,双击jdk ...
- java方法可变参数的写法
jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载.其实就是数组. package com.shipin; /** * @author QiaoJiafei * @vers ...
- 怎么运用好ZBrush中Magnify膨胀笔刷
Magnify膨胀笔刷是ZBrush笔刷中经常使用的,利用该笔刷可绘制中心向四周膨胀的效果.本文内容向大家介绍ZBrush®中膨胀笔刷以便大家熟悉它的用法和特性. 查看更多内容请直接前往:http:/ ...
- 项目回顾1-图片上传-form表单还是base64-前端图片压缩
第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下. 首先想到的是图片上传的问题.在通常表单数据都是ajax上 ...
- bzoj-3288 3288: Mato矩阵(数论)
题目链接: 3288: Mato矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description Mato同学最近正在研究一种矩阵,这种矩阵有n行n列第i ...
- Unity脚本生命周期
前言 说到生命周期,影响最深刻的是,在接触Java的JSF组件时,JSF组件的五大生命周期,全要默写出来,嘿嘿…… 总结这两天在写小怪和掉落的糖葫芦时,老是遇到GameObject未销毁,一直存在场景 ...
- JQuery demo
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- sqlSQL2008如何创建定时作业(代理服务)(转)
SQL2008如何创建定时作业?此方法也适应于Sql Server2005数据库,有兴趣的可以来看下! 1.打开[SQL Server Management Studio],在[对象资源管理器]列表中 ...
- C++哈弗曼编码
// haffman.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using name ...