当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
日前在网上见到一道Java笔试试题,如题所述。给出的答案如下:
答:不能,一个对象的一个synchronized方法只能由一个线程访问。
本人认为有些所答非所问。故写了两个demo进行测试。发现答案要分三种情况讨论。
情况一:
当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。
public class TestSync
{public synchronized void run1(){for (int i = 0; i < 1000; i++){System.out.println("execute run1");try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}public void run2(){for (int i = 0; i < 1000; i++){System.out.println("execute run2");try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}
}
public class TestThread
{public static void main(String[] args){final TestSync testSync = new TestSync();Thread thread1 = new Thread(new Runnable(){@Overridepublic void run(){testSync.run1();}});Thread thread2 = new Thread(new Runnable(){@Overridepublic void run(){testSync.run2();}});thread1.start();thread2.start();}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。 |
情况二:
当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。(代码略) |
情况三:
当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的其他同步方法。
public class TestSync
{public synchronized void run1(){for (int i = 0; i < 1000; i++){System.out.println("execute run1");try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}public synchronized void run2(){for (int i = 0; i < 1000; i++){System.out.println("execute run2");try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}
}
public class TestThread
{public static void main(String[] args){final TestSync testSync = new TestSync();Thread thread1 = new Thread(new Runnable(){@Overridepublic void run(){testSync.run1();}});Thread thread2 = new Thread(new Runnable(){@Overridepublic void run(){testSync.run2();}});thread1.start();thread2.start();}
}
运行结果:
前提条件:多个线程所持有的对象锁共享且唯一,如果每个线程所持有的对象锁不一样,那么该对象是锁不住的!
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的其他同步方法。
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?相关推荐
- 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(2nd) 日前在网上见到一道Java笔试试题,如题所述.给出的答案如下: 答:不能,一个对象的一个sy ...
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象其它方法?...
分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了sync ...
- java开局降落伞落地拿枪打_绝地求生:1月最新的跳伞技巧,一个开局捡空投,一个落地快4秒...
原标题:绝地求生:1月最新的跳伞技巧,一个开局捡空投,一个落地快4秒 大家好我是毅哥讲游戏,雪地地图上线后很多玩家回归了游戏,但身边不少朋友问我:怎么你以前的波浪跳伞攻略不管用了?嘿嘿~其实蓝洞已经对 ...
- 操作系统(3)-线程的六大状态、基于代码实战的线程创建及六个常用方法
一.进程和线程的简介 进程的概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 进程中所包含的一个或多个执行单元成为线程.进程还拥有一个私 ...
- Spring 中获取 request 的几种方法,及其线程安全性分析
概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...
- Java一个线程能否结束另一个永不停止的线程
在Java中停止一个线程有三种办法 : 1.正常结束执行: 2.发生异常; 3.被其他线程stop(Java官方不建议) 参考:https://docs.oracle.com/javase/8/doc ...
- Java单例设计模式(实现Java的一个类只有一个对象)
单例设计模式的定义:单例设计模式是一种软件设计模式,在它的核心包含一个称为单例类的核心类. 核心便是希望一个类只有一个对象. 如何实现类在内存中只有一个对象呢? 第一步:构造私有: 第二步:本身提供 ...
- JAVA 编写程序实现如下功能:一个线程进行如下运算1*2+2*3+3*4+……+19*20,而另一个线程则每隔一段时间读取前一个线程的运算结果。
编写程序实现如下功能:一个线程进行如下运算12+23+34+--+1920,而另一个线程则每隔一段时间读取前一个线程的运算结果. class Count{private int sum;Count(i ...
- java 停止一个线程_Java如何停止一个线程
线程正常执行完毕,正常结束. 2.监视某些条件,直到某些条件成立,结束线程. class TestMyThread extends Thread { private volatile boolean ...
最新文章
- 利用基于GPU的AI模拟一个现实宇宙 仅需36分钟
- python有哪些作用-python的函数有什么作用
- GARFIELD@05-04-2005
- iis6 配置python CGI
- Linux 实操 —— 日志筛选操作(sed与wc命令介绍)
- C++嵌入Python,以及两者混用
- php twig输出html,php – HTML不呈现[Twig] / [Slim]
- 【Java程序设计】类与对象的基本概念(上)
- 数字图像处理(MATLAB)(第三版) 冈萨雷斯 中的matlab附录代码工具箱
- 一个可以直接套用的行星齿轮传动比(转速比)结论
- 解决手机WiFi(电脑热点)一直正在获取IP地址或无法访问互联网【与网上其他方法不同】
- 七、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量控制
- 二、Contiki移植
- c语言计时纳秒_如何利用rdtsc计算纳秒级的时间
- 电脑C盘满了怎么办?教您3招快速释放C盘空间
- JAVA工程师面试题目大全_绝对值得看
- ThinkPHP5.0.11Day01: composer 、助手函数、配置文件
- python爬虫入门案例day10:珠宝图片
- 微信怎么解绑手机号?手把手教你具体操作步骤
- 如何系统学习MySQL数据库?