关于synchronized的问题。

关于synchronized的问题。

如果我在producer和consumer的run方法前也加上synchronized,会产生死锁情况,这是怎么回事啊?

//Producer
public synchronized void run() {
		int i=0;
		while(true) {
			queue.setN(i++);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	//Consumer
	public synchronized void run() {
		while(true) {
			queue.getN();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

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

?,多线程学的难受。

正在回答

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

2回答

同学你好,

1、synchronized最常用于线程并发编程时线程的同步。在本课程的run方法中会调用set或get方法,生成或消费n,对变量flag和n进行改变,所以我们就需要将这2个方法进行同步。当程序中多个线程会对同一个变量进行修改的时候,我们需要使用synchronized关键字保证线程同步。

2、run方法是线程启动时要执行的方法,没有对程序中变量进行修改,所以该方法不需要同步。

如果问题没有解决,同学可以贴一下代码,方便老师检查。祝学习愉快!

  • 慕容2892559 提问者 #1
    嗯嗯,老师是这个意思么:在多个线程可能对同一变量进行修改的地方(所在的方法)加synchronized? 假设现在是这样一个情况:线程1的run方法中有一段代码修改了变量a,还调用了一个方法b修改了变量c,线程2的run方法中有一段代码修改了变量a,还调用了一个方法d修改了变量c。那么为了保证同步是不是线程1,2的run方法,方法b,d都要加synchronized?
    2020-04-22 15:01:48
  • 好帮手慕阿慧 回复 提问者 慕容2892559 #2
    同学你好,是的,这4个方法都需要加synchronized。祝学习愉快!
    2020-04-22 15:31:34
提问者 慕容2892559 2020-04-22 11:57:45

补充:我想问的其实是应该在哪里加synchronized啊?本例中为什么run方法不加synchronized呢?

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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