Set2017 2017-06-13 11:35 采纳率: 25%
浏览 810
已采纳

java 多线程、锁的问题 synchronized

 package com.thread.main;

import org.junit.jupiter.api.Test;

/**
 * Created by Administrator on 2017/6/13.
 */
public class MyThread{
    @Test
    public void main() {
        new B().start();
        new C().start();
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


class Home {
    private static Home home;
    private Home(){}
    public static Home getInstance(){
        if (home == null) {
            synchronized (Home.class) {
                home = new Home();
            }
        }
        return home;
    }
    public static String name;
    public synchronized String into(String name1) {
        System.out.println(name1+"进来了");
        this.name = name1;
        if ("张三".equals(name1)) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return name;
    }
}
class B extends Thread{
    @Override
    public void run() {
        Home home = Home.getInstance();
        System.out.println("B:"+home.into("张三"));
    }
}
class C extends Thread{
    @Override
    public void run() {
        Home home = Home.getInstance();
        System.out.println("C:"+home.into("李四"));
    }
}

打印结果:
张三进来了
李四进来了
C:李四
B:李四
synchronized不是方法同步吗,为什么针对多个线程同时访问的时候会出现这个问题呢,小弟这点没搞懂,请各位解答下,谢谢

  • 写回答

3条回答

  • miaoch 2017-06-14 03:01
    关注

    首先 如果你Home.getInstance(); 得到的如果是两个不一样的对象,那么这个现象就很好解释,因为是不同对象,那synchronized只是对相同对象两个线程调用才会起作用。
    所以先执行张三 name=张三 然后sleep 再李四 name=李四 返回c:李四 然后sleep结束 name已经被修改为李四,然后就是b:李四。
    其实在运行过程你也会发现,先是马上打印 张三 李四C:李四 这恰恰说明了 synchronized没有起作用

    那为什么会得到两个不一样的对象呢?你发现你写的getInstance()的问题了没有?假设 B类和C类同时进入了 if,然后就会发生张三得到new Home();
    李四再次得到new Home();
    所以改成

         public static Home getInstance(){
            synchronized (Home.class) {
                if (home == null) {
                    home = new Home();
                }
            }
            return home;
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名