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条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况