Set2017 2017-06-13 11:35 采纳率: 0%
浏览 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 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题
  • ¥15 MPLS/VPN实验中MPLS的配置问题
  • ¥15 materialstudio氢键计算问题
  • ¥15 echarts图表制作
  • ¥15 halcon根据玻璃面板纹路取区域
  • ¥15 HFSS设计小型化180度耦合器
  • ¥15 使用CInternetSession,CHttpFile读取网页文件时有些电脑上会卡住怎么办?
  • ¥15 水下机器人的半物理仿真研究
  • ¥15 微服务假死,一段时间后自动恢复,如何排查处理