java一个类可以同时被访问吗,Java中两个线程是否可以同时访问同一个对象的两个不同的synchronized方法?...
public classSyncMethod {public synchronized voidsyncMethod2() {try{
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@ (syncMethod2, 已经获取内置锁`SyncMethod.this`)");
Thread.sleep(5000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@ (syncMethod2, 即将释放内置锁`SyncMethod.this`)");
}public synchronized voidsyncMethod1() {
System.out.println("######################## (syncMethod1, 已经获取内置锁`SyncMethod.this`, 并即将退出)");
}static class Thread1 extendsThread {
SyncMethod syncMethod;publicThread1(SyncMethod syncMethod) {this.syncMethod =syncMethod;
}
@Overridepublic voidrun() {
syncMethod.syncMethod2();
}
}static class Thread2 extendsThread {
SyncMethod syncMethod;publicThread2(SyncMethod syncMethod) {this.syncMethod =syncMethod;
}
@Overridepublic voidrun() {
System.out.println("Thread2 running ...");
syncMethod.syncMethod1();
}
}public static void main(String[] args) throwsInterruptedException {
SyncMethod syncMethod= newSyncMethod();
Thread1 thread1= newThread1(syncMethod);
Thread2 thread2= newThread2(syncMethod);
thread1.start();//先执行, 以便抢占锁
Thread.sleep(500); //放弃cpu, 让thread1执行, 以便获的锁
thread2.start();//在syncMethod1()方法获得锁时, 看看syncMethod2()方法能否执行
/*能否并发执行同一个对象不同的synchronized方法, 即看看能否同时进入一个对象synchronized方法块
1. 创建一个有两个synchronized方法的对象`syncMethod`
2. 先启动一个线程(Thread1), 并让其进入syncMethod对象的sychronized方法(syncMethod1)内, 并使其停在synchronized方法内
3. 再启动一个线程(Thread2), 并执行syncMethod对象的一个synchronized方法(syncMethod2), 看看能否进入此方法内
输出如下:
@@@@@@@@@@@@@@@@@@@@@@@@ (syncMethod2, 已经获取内置锁`SyncMethod.this`)
Thread2 running ...
@@@@@@@@@@@@@@@@@@@@@@@@ (syncMethod2, 即将释放内置锁`SyncMethod.this`)
######################## (syncMethod1, 已经获取内置锁`SyncMethod.this`, 并即将退出)
结果分析:
观察显示, 在输出`Thread2 running ...`后会暂停数秒(Thread2无法获得锁而被挂起, 因为锁已经被Thread1持有).
如果不同线程可以同时访问同一个对象不同synchronized方法的话,
在有足够cpu时间片时(Thread1在调用syncMethod1时使用Thread.sleep放弃了cpu),
Thread2调用的syncMethod2方法应该马上执行, 也就是syncMethod2方法中的语句在`Thread2 running ...`语句输出后马上输出,
而不是等待数秒才输出 (应为此时没有其他线程跟Thread2竞争cpu, 况且现在的电脑都不只一个cpu),
因此得出结论: "不同线程不能同时执行一个对象的不同synchronized方法"
其实此结论是显而易见的, 原理前面已经阐明, 此处不再赘述.*/}
}
java一个类可以同时被访问吗,Java中两个线程是否可以同时访问同一个对象的两个不同的synchronized方法?...相关推荐
- 编程:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”...
Question:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?". Answer: public ...
- java一个类多次加载_据说99.99%的人都会答错的类加载问题
概述 首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题. 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗? 请仔 ...
- java一个类只能创建一个对象吗_一个类只能有一个对象,对么
一个类只能有一个对象,不对.类是用户定义的一种数据类型,可以使用这个类型来说明一个或多个变量,及对象.类是一种抽象的数据类型,是对对象的抽象:对象是对客观事物的抽象. 一个类只能有一个对象,不对. 类 ...
- java一个类添加多个接口_Java的一个类可以实现多个接口。
Java的一个类可以实现多个接口. 答:√ 下列原始凭证中属于一次凭证的有( ). 答: 收据 收料单 完全角化细胞在显微镜下不可能出现的颜色是 答:白色 In a language classroo ...
- java工具类怎么写_常用的Java工具类——十六种
常用的Java工具类--十六种 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选 ...
- Java数据结构类如何使用_Matlab如何使用Java的数据结构类型
Matlab 2008b才开始引入containers.Map,这是Matlab唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型).如果要有其它,比如Queue.Set等 ...
- java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...
笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...
- java 枚举类 int_【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
- java 外来类,外来的Matplotlib图(tkinter中的情节)
这是我的第一个python项目,我试图在Matplotlib中绘制Mandelbrot集并将其放入tkinter框架中 . 这已经完成,但是随着GUI出现了一个无关的空图 . 这个空图具有正确数量的刻 ...
最新文章
- Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
- 有哪些看起来很沙雕的公众号,实质上却年薪百万?
- Mysql 添加字段 修改字段 删除字段
- C++ int与string的转化
- C++笔记——自定义函数
- 传腾讯人事大地震 马化腾将重整公司架构
- Unix——《Unix网络编程》配置unp.h头文件
- ROS-手势控制小海龟移动
- mysql的两种存储方法_mysql的两种存储引擎
- CCF CSP201903-1 小中大
- c语言可以发现注释错误,编译时可以发现注释中的错误_c语言中不允许使用
- int转字符串_python3基础01数值和字符串(一)
- 中国兽药市场投资分析与发展前景展望报告2022版
- windows server 2016 活动目录部署系列(三)加入域且创建域用户
- Tungsten Fabric如何增强Kubernetes的网络性能
- 聂微东:《暗时间》读书笔记与读后感 - 博客 - 伯乐在线
- 微商个人相册多端小程序源码
- 抓包工具:教你搞懂websocket如何来分析
- xshell 登录计算节点_使用xshell远程连接
- 虚幻4学习笔记(10)蓝图接口、拾取物品-射线检测