关于synchronized的疑问
在Cat进程类中用了synchronized为什么其他进程还是可以访问?应该显示1:Miao ~ A cat 才对呀?
package thread; class Cat implements Runnable{ @Override public void run() { // TODO Auto-generated method stub this.info(); } public synchronized void info() { for (int i = 1; i<4; i++) { System.out.print(i + " :"); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " A cat"); } System.out.println("aaaaaaa"); } } class Dog implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 1; i<4; i++) { System.out.println(Thread.currentThread().getName() +" A dog"); } } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Cat c = new Cat(); Dog d = new Dog(); //Miao~ 和 Wang~~ 为自定义进程名 Thread t1 = new Thread(c, "Miao~"); Thread t2 = new Thread(d, "Wang~~"); t1.start(); t2.start(); // for (int i = 1; i<4;i++) { // System.out.println("main thread"); // } } }
13
收起
正在回答 回答被采纳积分+1
3回答
慕婉清0129613
2019-08-27 21:39:51
synchronized是对同一对象进行锁定,cat和dog显然不是同意对象,所以的cpu空闲时其他线程汇运行
好帮手慕小班
2019-08-18 15:29:05
同学你好,1、这里可以这样理解:synchronized会对对象加锁,同一时刻只有一个线程能访问该对象,在线程的执行过程中,获取到CPU时间片就可以执行这个线程中的内容!
对应在贴出代码的执行:(随机的执行结果,多运行几次,结果是不同的)
首先t1线程获取到了CPU时间片,开始执行线程,执行System.out.print(i + " :");此时i的值为1,输出 1: ,紧接着执行了sleep休眠方法500毫秒,main方法获取到了CPU时间片,开始执行内容,输出main thread,执行完了,接下来t2线程获取到了CPU时间片,执行Wang····,也执行完毕,接下来t1线程再次获取到CPU时间片,执行线程,执行完毕,输出了Miao···中所有内容!
2、如果这里只创建一个Cat对象,不同的线程去访问它,例如:
如上所示,当不同的线程,访问同一个对象,synchronized修饰的方法,在执行过程中不会被打断!
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
相似问题
登录后可查看更多问答,登录/注册
1. Java 零基础入门
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星