Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步块工作不正常_Java_Multithreading_Synchronisation - Fatal编程技术网

Java 同步块工作不正常

Java 同步块工作不正常,java,multithreading,synchronisation,Java,Multithreading,Synchronisation,我正在尝试运行以下代码,但无法获得正确的输出 预期产量 “欢迎新程序员” 实际产量 “欢迎新程序员” 我哪里做错了? 有人能纠正我吗 从构造函数启动线程是个坏主意。这违反了安全施工的原则 在构造过程中,让此引用逃逸的一个常见错误是从构造函数启动线程。当一个对象从其构造函数创建一个线程时,它几乎总是与新线程共享它的this引用,或者显式地(通过将它传递给构造函数)或者隐式地(因为线程或者可运行的是所属对象的内部类)。然后,新线程可能能够在其完全构造之前看到所属对象 在构造函数中创建线程没有错,但最

我正在尝试运行以下代码,但无法获得正确的输出

预期产量 “欢迎新程序员”

实际产量 “欢迎新程序员”

我哪里做错了? 有人能纠正我吗

  • 从构造函数启动线程是个坏主意。这违反了安全施工的原则

    在构造过程中,让此引用逃逸的一个常见错误是从构造函数启动线程。当一个对象从其构造函数创建一个线程时,它几乎总是与新线程共享它的this引用,或者显式地(通过将它传递给构造函数)或者隐式地(因为
    线程
    或者
    可运行的
    是所属对象的内部类)。然后,新线程可能能够在其完全构造之前看到所属对象

    在构造函数中创建线程没有错,但最好不要立即启动线程。相反,公开启动所属线程的
    start
    initialize
    方法。从构造函数调用可重写实例方法(既不是
    private
    也不是
    final
    )也可以允许
    this
    引用转义

    3.2.1安全施工实践,Brian Goetz的Java并行实践

  • Thread#start()
    调用可能需要一些时间,因此预期的
    “欢迎->“新”->“程序员”
    实际上可以是任意顺序

  • 要执行您计划的操作,我们需要确保在转到下一个之前,上一个
    run()
    已开始执行。对于我的机器,调用之间的
    100L
    睡眠足以获得正确的顺序

    Second ss = new Second(fnew, "welcome");
    Thread.sleep(100L);
    Second ss1 = new Second(fnew,"new");
    Thread.sleep(100L);
    Second ss2 = new Second(fnew, "programmer");
    
    这不是一种好技术,你不应该这样使用它。它使执行顺序化——我们不会从多线程中获得任何好处

  • 从构造函数启动线程是个坏主意。它违反了安全构造的原则

    在构造过程中,让this引用逃逸的一个常见错误是从构造函数启动线程。当对象从其构造函数创建线程时,它几乎总是显式(通过将this引用传递给构造函数)或隐式地将this引用与新线程共享(因为
    Thread
    Runnable
    是拥有对象的内部类)。新线程可能会在完全构造拥有对象之前看到它

    在构造函数中创建线程没有错,但最好不要立即启动线程。相反,公开启动所拥有线程的
    start
    initialize
    方法。调用可重写实例方法(既不是
    private
    也不是
    final
    )从构造函数中也可以允许
    引用转义

    3.2.1安全施工实践,Brian Goetz的Java并行实践

  • Thread#start()
    调用可能需要一些时间,因此预期的
    “欢迎->“新”->“程序员”
    实际上可以是任意顺序

  • 要执行您计划的操作,我们需要确保在转到下一个之前,上一个
    run()
    已开始执行。对于我的机器,调用之间的
    100L
    睡眠足以获得正确的顺序

    Second ss = new Second(fnew, "welcome");
    Thread.sleep(100L);
    Second ss1 = new Second(fnew,"new");
    Thread.sleep(100L);
    Second ss2 = new Second(fnew, "programmer");
    

    这不是一个好的技术,你不应该这样使用它。它使执行顺序化——我们不会从多线程中获得任何好处。

    我认为你忘记了实现可调用或可运行的或第二个类需要的任何东西。

    我认为你忘记了实现可调用或可运行的或第二个类需要的任何东西类。

    您在这里没有执行任何多线程操作,因此问题与
    已同步
    无关。如果删除
    已同步
    关键字/包装,它将打印相同的内容。-或者您忘记了代码中的某些内容吗?没有
    开始()类
    Second
    中的
    方法,所以它甚至不会编译。@Jesper,他正在做,只是错过了示例中的
    扩展线程
    。除了上面的注释:您的
    Second
    构造函数正在调用缺少的方法
    start();
    。是否意外删除了重要的详细信息?启动方法已在第二类中定义请注意,
    已同步的
    块是多余的,因为您使
    显示()
    method
    synchronized
    您在这里没有执行任何多线程,因此问题与
    synchronized
    无关。如果删除
    synchronized
    关键字/包装,它将打印相同的内容。-或者您忘记了代码中的某些内容吗?没有
    start()类
    Second
    中的
    方法,所以它甚至不会编译。@Jesper,他正在做,只是错过了示例中的
    扩展线程
    。除了上面的注释:您的
    Second
    构造函数正在调用缺少的方法
    start()
    。是否意外删除了重要的细节?启动方法已在第二类中定义请注意,
    synchronized
    块是多余的,因为您使
    display()
    method
    synchronized
    错误,
    Callable
    Runnable
    都没有
    start()
    method这是错误的,
    Callable
    Runnable
    都没有
    start()
    method@JaySuthar,如果你找到答案,你可以接受useful@JaySuthar,如果你觉得答案有用,你可以接受