关于synchronized的疑问

关于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");
//		}
	}

}

http://img1.sycdn.imooc.com//climg/5d5857eb0001a4d003710200.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
慕婉清0129613 2019-08-27 21:39:51

synchronized是对同一对象进行锁定,cat和dog显然不是同意对象,所以的cpu空闲时其他线程汇运行

  • 同学,理解的很棒!继续努力~祝学习愉快!
    2019-08-28 10:02:52
好帮手慕小班 2019-08-18 15:29:05

同学你好,1、这里可以这样理解:synchronized会对对象加锁,同一时刻只有一个线程能访问该对象,在线程的执行过程中,获取到CPU时间片就可以执行这个线程中的内容!

对应在贴出代码的执行:(随机的执行结果,多运行几次,结果是不同的)

http://img1.sycdn.imooc.com//climg/5d58fc210001fbe506180742.jpg

首先t1线程获取到了CPU时间片,开始执行线程,执行System.out.print(i + " :");此时i的值为1,输出  1:  ,紧接着执行了sleep休眠方法500毫秒,main方法获取到了CPU时间片,开始执行内容,输出main thread,执行完了,接下来t2线程获取到了CPU时间片,执行Wang····,也执行完毕,接下来t1线程再次获取到CPU时间片,执行线程,执行完毕,输出了Miao···中所有内容!

2、如果这里只创建一个Cat对象,不同的线程去访问它,例如:

http://img1.sycdn.imooc.com//climg/5d58fdcb0001222e05420700.jpg

如上所示,当不同的线程,访问同一个对象,synchronized修饰的方法,在执行过程中不会被打断!

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

好帮手慕小班 2019-08-18 09:49:40

同学你好,1、如果一个方法或一段代码在执行过程中不希望被打断,就可以加上synchronized在执行过程中可以加上锁,如果不加synchronized,就会出现这个方法执行一半,就会被其他线程打断的情况!

2、加上synchronized的含义是在执行过程中不被其他线程打断,而不是其他线程不能执行!比如:

http://img1.sycdn.imooc.com//climg/5d58aea30001d2ae02770262.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 weixin_慕勒8187086 #1
    可能是我没表诉清楚, 我的意思是cat线程类中info方法中是先打印i的值,然后在i的值后面打印“Miao~ A Cat”,循环结束后最后打印aaaaaa.其理想输出结果应该是 1 :Miao~ A Cat 2 :Miao~ A Cat 3 :Miao~ A Cat aaaaaaaaa 但实际结果是1 : Wang~~ A Dog, 那不是输出第一个i的值之后被Dog线程打断了吗?该方法加上synchronized啊。
    2019-08-18 12:30:40
  • 老师这个不还是被打断了吗 1:后直接狗的线程执行了?我理解的是加上synchronized关键字后的Cat类中的info()方法应该完整输出啊,而不是先输出1:后狗线程执行完了再猫线程连续输出
    2019-08-25 21:24:05
  • 同学你好,同学的理想输出是在两个线程都传入的是同一个cat对象的时候可以实现,直接在方法上加synchronized锁的就是当前的实例对象,当传入的是同一个实例对象时,两个进入这个方法后,两个线程不会同时进行,而如果传入的是不同的对象,则两个线程还是并行的跑的,就像在一个银行大厅中,两个人还是各自干各自的事情,但说话声会在同一个大厅中。假如有个录音设备,那么: A:你好 ,我来取钱 。另一办业务的客户B:可能就在A说出 “你好” 的时候,说“你好,我来存款。” 如果B说话很快的话,录音出来了就会是“你好”“你好,我来存款”“我来取钱”。他们两个是同时进行的,但在业务上是互不干扰的。只是因为使用同一个控制台,所以交替输出了。但假如客户始终是一个人,则它就会说,“你好,我是来取钱的”,“你好,我是来存钱的”。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-08-26 11:22:59
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师