zkzk7410 2017-04-22 15:15 采纳率: 68.8%
浏览 820
已采纳

『初学请教』Java线程同步问题

请教大虾线程问题,如下代码:
package com.test;

public class Timer {

private static int num = 0;

public synchronized void add(String name) {
    num++;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(name + "是第" + num + "个访问的用户");
}

}

package com.test;

public class TestSync implements Runnable {

private Timer t = new Timer();

public void run() {
    t.add(Thread.currentThread().getName());
}

}

package com.test;

public class test {

/**
 * @param args
 */
public static void main(String[] args) {
    Thread t1=new Thread(new TestSync());
    Thread t2=new Thread(new TestSync());
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
}

}

输出的结果一直是:
t1是第2个访问的用户
t2是第2个访问的用户


疑问: 明明已经给 Timer类的add方法加了synchronized, 为么结果都是显示是第2个访问的用户

请求大神指点,小弟在此谢过!

  • 写回答

4条回答 默认 最新

  • weixin_38388710 2017-04-22 15:46
    关注

    流程分析:首先主线程执行并开启两个线程t1、t2,接下来就是三个线程争抢CPU控制权,假设t1获得控制权,t1线程新建一个timer对象并调用其add方法(这时add方法用的是此timer对象锁,还有忘记说了mun+1),然后t1线程睡眠一秒,其他线程获得控制权,假设t2线程获得控制权,t2线程又创建一个timer对象并调用add方法(此时add方法的锁改为t2timer的锁,mun又加一次1,此时mun为2),接下来自己分析。手打不易不喜勿喷。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算