关于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");
// }
}
}
正在回答 回答被采纳积分+1
synchronized是对同一对象进行锁定,cat和dog显然不是同意对象,所以的cpu空闲时其他线程汇运行
同学你好,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修饰的方法,在执行过程中不会被打断!
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星