java synchronized 参数_java – 将参数传递给synchronized块的目的是什么?
我知道
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块的目的是什么?相关推荐
- java 什么是参数_java中参数是什么?
java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...
- java启动参数_Java启动参数的思考
1. -XX:+DisableExplicitGC Java在实现RMI Server的时候会通过定时的调System.gc来强制做GC(即使程序里没用到RMI也会被启动),这个动作非常烦人,另外也是 ...
- java+list可变参数_Java 可变参数
众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...
- java变长参数_Java可变长度参数
术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...
- 【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)
1. why 为什么要拦截传递给 mapper 文件的参数对象呢?因为要对指定属性设置默认值.如何拦截传递给 mapper 文件的参数对象可以参考<使用(org.apache.ibatis.pl ...
- java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理
Java多线程:由浅入深看synchronized的底层实现原理-1.jpg (91.72 KB, 下载次数: 0) 2018-9-21 03:55 上传 前言 前俩篇文章,我们聊了聊线程/进程的概念 ...
- java反射传递参数_Java反射 调用传参
//测试方法 @Test public void test01() { Class p = null; Person01 person01 = new Person01(); try { p = Cl ...
- java方法的参数_Java方法参数
Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...
- java 接口校验接收参数_java接口参数校验
(可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现... 接口标准> (以下简称"接口标准" ) <数据对接接口校验规则> < ...
最新文章
- Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
- 基于OpenCV的网络实时视频流传输
- html计时节日,原生js实现节日时间倒计时功能
- 10.NoSQL数据库第2部分
- 第一百一十二期:96秒100亿!如何抗住双11高并发流量?
- 【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
- PHP中cookie和session
- java 降低jdk版本_jdk1.7降级到1.6 | 学步园
- 电子/硬件工程师手册
- eos java调用命名sql_普元EOS中命名sql数据集
- 深度学习求解魔方新方法!诺丁汉大学研究团队提出适应度函数
- python图像手绘效果_如何使用Python实现手绘图效果
- 高中计算机数学,高中数学必修5
- 跨境电商亚马逊产品运营模式都有哪些
- 关于指针所占的字节数
- CentOS 6.5安装Nvidia显卡驱动
- 计算机科学计算矩阵答案,计算机科学计算答案.doc
- python win10 桌面_实战 | Python批量提取Win10锁屏壁纸
- 2022年高新技术企业认定的补贴有多少?
- 前景好过富士康?苹果订单助台积电股价创新高
热门文章
- iis服务器发布web项目,webservice创建、发布及在IIS上部署
- php无参rce,php中无参函数的RCE
- c语言槟编程把两个数交换,第三章管理信息系统技术基础.doc
- PHP 设计模式之工厂模式 (静态工厂模式)
- JAVA_返回一个数值的相反数的几种方式.
- 存货控制中的ABC分类释义
- C# 实体类序列化与反序列化一 (XmlSerializer)
- 简单实用读取字符串信息的c++类
- iOS - Card Identification 银行卡号识别
- 基于dubbo + maven 的项目搭建