我知道

When you synchronize a block of code, you specify which object’s lock

you want to use as the lock, so you could, for example, use some

third-party object as the lock for this piece of code. That gives you

the ability to have more than one lock for code synchronization within

a single object.

但是,我不明白需要将参数传递给块.因为我是否传递String的实例并不重要,无论传递给块的参数如何,作为同步块的同步块的一些随机类的实例都能正常工作.

所以我的问题是,如果无论如何同步块阻止两个线程同时进入临界区.那么为什么需要传递一个论点呢? (我的意思是默认获取某些随机对象的锁定).

我希望我正确地提出了我的问题.

我尝试了以下示例,随机参数是同步块.

public class Launcher {

public static void main(String[] args) {

AccountOperations accOps=new AccountOperations();

Thread lucy=new Thread(accOps,"Lucy");

Thread sam=new Thread(accOps,"Sam");

lucy.start();

sam.start();

}

}

使用非静态同步块:

public class AccountOperations implements Runnable{

private Account account = new Account();

public void run(){

for(int i=0;i<5;i++){

makeWithdrawal(10);

}

}

public void makeWithdrawal(int amount){

String str="asd"

synchronized (str /* pass any non-null object the synchronized block works*/) {

if(account.getAmount()>10){

try{

Thread.sleep(5000);

}catch(InterruptedException e){

e.printStackTrace();

}

account.withdraw(amount);

System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());

}else{

System.out.println("Insufficient funds "+account.getAmount());

}

}

}

}

使用静态同步块:

public class AccountOperations implements Runnable{

private static Account account = new Account();

public void run(){

for(int i=0;i<5;i++){

makeWithdrawal(10);

}

}

public static void makeWithdrawal(int amount){

synchronized (String.class /* pass any class literal synchronized block works*/) {

if(account.getAmount()>10){

try{

Thread.sleep(5000);

}catch(InterruptedException e){

e.printStackTrace();

}

account.withdraw(amount);

System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());

}else{

System.out.println("Insufficient funds "+account.getAmount());

}

}

}

}

java synchronized 参数_java – 将参数传递给synchronized块的目的是什么?相关推荐

  1. java 什么是参数_java中参数是什么?

    java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...

  2. java启动参数_Java启动参数的思考

    1. -XX:+DisableExplicitGC Java在实现RMI Server的时候会通过定时的调System.gc来强制做GC(即使程序里没用到RMI也会被启动),这个动作非常烦人,另外也是 ...

  3. java+list可变参数_Java 可变参数

    众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...

  4. java变长参数_Java可变长度参数

    术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...

  5. 【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)

    1. why 为什么要拦截传递给 mapper 文件的参数对象呢?因为要对指定属性设置默认值.如何拦截传递给 mapper 文件的参数对象可以参考<使用(org.apache.ibatis.pl ...

  6. java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理

    Java多线程:由浅入深看synchronized的底层实现原理-1.jpg (91.72 KB, 下载次数: 0) 2018-9-21 03:55 上传 前言 前俩篇文章,我们聊了聊线程/进程的概念 ...

  7. java反射传递参数_Java反射 调用传参

    //测试方法 @Test public void test01() { Class p = null; Person01 person01 = new Person01(); try { p = Cl ...

  8. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

  9. java 接口校验接收参数_java接口参数校验

    (可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现... 接口标准> (以下简称"接口标准" ) <数据对接接口校验规则> < ...

最新文章

  1. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
  2. 基于OpenCV的网络实时视频流传输
  3. html计时节日,原生js实现节日时间倒计时功能
  4. 10.NoSQL数据库第2部分
  5. 第一百一十二期:96秒100亿!如何抗住双11高并发流量?
  6. 【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
  7. PHP中cookie和session
  8. java 降低jdk版本_jdk1.7降级到1.6 | 学步园
  9. 电子/硬件工程师手册
  10. eos java调用命名sql_普元EOS中命名sql数据集
  11. 深度学习求解魔方新方法!诺丁汉大学研究团队提出适应度函数
  12. python图像手绘效果_如何使用Python实现手绘图效果
  13. 高中计算机数学,高中数学必修5
  14. 跨境电商亚马逊产品运营模式都有哪些
  15. 关于指针所占的字节数
  16. CentOS 6.5安装Nvidia显卡驱动
  17. 计算机科学计算矩阵答案,计算机科学计算答案.doc
  18. python win10 桌面_实战 | Python批量提取Win10锁屏壁纸
  19. 2022年高新技术企业认定的补贴有多少?
  20. 前景好过富士康?苹果订单助台积电股价创新高

热门文章

  1. iis服务器发布web项目,webservice创建、发布及在IIS上部署
  2. php无参rce,php中无参函数的RCE
  3. c语言槟编程把两个数交换,第三章管理信息系统技术基础.doc
  4. PHP 设计模式之工厂模式 (静态工厂模式)
  5. JAVA_返回一个数值的相反数的几种方式.
  6. 存货控制中的ABC分类释义
  7. C# 实体类序列化与反序列化一 (XmlSerializer)
  8. 简单实用读取字符串信息的c++类
  9. iOS - Card Identification 银行卡号识别
  10. 基于dubbo + maven 的项目搭建