从版本1.0开始,java中每个对象都有一个内部锁,如果一个方法用synchronized修饰,那么对象的锁将保护整个方法,也就是说要调用该方法,线程必须获得内部的对象锁

换句话说

public synchronized void method(){

  method body

}

等价于

public void method(){

this.lock();
try{
method body;
}
finally{this.unlock} }

内部对象只有一个相关条件,wait方法添加一个线程到等待集中,notifyAll方法解除等待线程的阻塞状态

package reentrant_lock;

/**
* Created by luozhitao on 2017/8/23.
*/
public class bank_syn { private double [] accounts; public bank_syn(int n,double bance){ accounts=new double[n]; for(int i=0;i<n;i++){ accounts[i]=bance; } }
// public synchronized void tansfer(int from,int to,double transf_num) throws InterruptedException{ while (accounts[from]<transf_num)
wait(); accounts[from]-=transf_num;
System.out.printf("转出账户转出%f 剩余 %10.2f",transf_num,accounts[from]); accounts[to]+=transf_num;
System.out.printf("转入账户目前余额为 %10.2f",accounts[to]); notifyAll();
System.out.printf(" 目前所有账户总额为 %10.2f",get_total()); } public synchronized double get_total(){ double sum=0; for (double d:accounts){ sum+=d;
} return sum;
} //
public int size(){ return accounts.length;
} }

主线程

package reentrant_lock;

/**
* Created by luozhitao on 2017/8/18.
*/
public class transferRunnable implements Runnable { // private Bank bank;
private bank_syn bank;
private int fromAccount;
private double maxAccount;
private int DELAY=10;
int flag=0; public transferRunnable(bank_syn b,int from,double max){
this.bank=b;
this.fromAccount=from;
this.maxAccount=max; } public void run() { try{
while (true){
int toAccount=(int)((bank.size()-1)*Math.random()); System.out.println("toAccount ="+toAccount);
double account_m=maxAccount*Math.random();
System.out.println("account_m is "+account_m);
bank.tansfer(fromAccount,toAccount,account_m); Thread.sleep((int) (DELAY * Math.random()));
flag++; }
}catch (InterruptedException e){e.printStackTrace();} }
}

main

package reentrant_lock;

/**
* Created by luozhitao on 2017/8/23.
*/
public class bank_testsyn { private static int accoun_num=100;
private static double init_num=1000; public static void main(String [] args){ bank_syn syn=new bank_syn(accoun_num,init_num); for(int i=0;i<accoun_num;i++){
transferRunnable transferrun = new transferRunnable(syn,i,init_num);
Thread t=new Thread(transferrun);
t.start(); } } }

java 并发synchronized使用的更多相关文章

  1. java 并发——synchronized

    java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...

  2. Java并发——synchronized关键字

    前言: 只要涉及到Java并发那么我们就会考虑线程安全,实际上能够实现线程安全的方法很多,今天先介绍一下synchronized关键字,主要从使用,原理介绍 一.synchronized的使用方法 1 ...

  3. Java并发-Synchronized关键字

    一.多线程下的i++操作的并发问题 package passtra; public class SynchronizedDemo implements Runnable{ private static ...

  4. Java并发--synchronized

    以下是本文的目录大纲: 一.什么时候会出现线程安全问题? 二.如何解决线程安全问题? 三.synchronized同步方法或者同步块 转载原文链接:http://www.cnblogs.com/dol ...

  5. Java并发synchronized详解

    今天和大家一起学习下并发编程,先举一个简单的生活例子,我们去医院或者银行排队叫号,那每个工作人员之间如何保证不会叫重号呢? public class TicketDemo extends Thread ...

  6. 精通java并发-synchronized关键字和锁

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages synchronized关键字和锁 示例代码 public class MyThreadTest2 { public ...

  7. 深入理解Java并发synchronized同步化的代码块不是this对象时的操作

    本文仅仅是为了说明synchronized关键字同步的是对象不是方法,列子的确有失偏颇. 一.明确一点synchronized同步的是对象不是方法也不是代码块  我有关synchronized同步的是 ...

  8. Java并发——synchronized和ReentrantLock的联系与区别

    0 前言 本文通过使用synchronized以及Lock分别完成"生产消费场景",再引出两种锁机制的关系和区别,以及一些关于锁的知识点. 本文原创,转载请注明出处:http:// ...

  9. Java并发—synchronized关键字

    synchronized关键字的作用是线程同步,而线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. synchronized用法 1. 在需要同步的方法的方法签名中加入synchro ...

随机推荐

  1. POJ1247-Magnificent Meatballs

    http://poj.org/problem?id=1247 Magnificent Meatballs Time Limit: 1000MS   Memory Limit: 10000K Total ...

  2. oracle 11g安装过程中问题:移动bin\oralbac11.dll 到bin\oralbac11.dll.dbl出错

    解决方法: 直接找到oralbac11.dll.dbl这个文件,将其删除即可.   http://blog.sina.com.cn/s/blog_51beaf0e0101000v.html

  3. vim编程技巧

    1, :E 浏览目录 如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令: :cd <dir> – 改变当前目录 :pwd  - 查看当前目录 2, :l ...

  4. 设计模式--中介者模式C++实现

    中介者模式C++实现 1定义 用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互 2类图 组成说明 Mediator抽象中介者 ...

  5. 十四 web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    打码接口文件 # -*- coding: cp936 -*- import sys import os from ctypes import * # 下载接口放目录 http://www.yundam ...

  6. LA-4255 Guess (拓扑排序+构造)

    题目大意:一个未知的整数序列,给出其任意一个区间和的正负,还原这个序列.任意一个满足条件的序列即可. 题目分析:将连续区间和转化为前缀和之差,sumx-1与sumy的大小关系已知,以此建立一条有向边, ...

  7. 【转】c++析构函数(Destructor)

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...

  8. JavaScript---事件监听

    JavaScript的事件监听是通过addEventListener()来实现的 它算是事件绑定的第二种方式. 他的特别之处在于这种绑定事件的方法不会被同名事件覆盖. 看具体的demo <!DO ...

  9. C++复习4.函数设计基础

    C/C++ 函数设计基础 20130918 函数式程序的基本功能单元,是模块化程序设计的基础,即使函数的功能正确是不够的,因为函数设计的细微缺点很容易导致函数被错用. 了解函数的基本知识,堆栈和堆的相 ...

  10. 【2018多校第一场】hdu6308-Time Zone(日期)

    Problem Description Chiaki often participates in international competitive programming contests. The ...