关于synchronized的问题。

关于synchronized的问题。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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