Java 同步块工作不正常
我正在尝试运行以下代码,但无法获得正确的输出 预期产量 “欢迎新程序员” 实际产量 “欢迎新程序员” 我哪里做错了? 有人能纠正我吗Java 同步块工作不正常,java,multithreading,synchronisation,Java,Multithreading,Synchronisation,我正在尝试运行以下代码,但无法获得正确的输出 预期产量 “欢迎新程序员” 实际产量 “欢迎新程序员” 我哪里做错了? 有人能纠正我吗 从构造函数启动线程是个坏主意。这违反了安全施工的原则 在构造过程中,让此引用逃逸的一个常见错误是从构造函数启动线程。当一个对象从其构造函数创建一个线程时,它几乎总是与新线程共享它的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");
这不是一种好技术,你不应该这样使用它。它使执行顺序化——我们不会从多线程中获得任何好处
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();
。是否意外删除了重要的详细信息?启动方法已在第二类中定义请注意,已同步的
块是多余的,因为您使显示()
methodsynchronized
您在这里没有执行任何多线程,因此问题与synchronized
无关。如果删除synchronized
关键字/包装,它将打印相同的内容。-或者您忘记了代码中的某些内容吗?没有start()类Second
中的
方法,所以它甚至不会编译。@Jesper,他正在做,只是错过了示例中的扩展线程
。除了上面的注释:您的Second
构造函数正在调用缺少的方法start()
。是否意外删除了重要的细节?启动方法已在第二类中定义请注意,synchronized
块是多余的,因为您使display()
methodsynchronized
错误,Callable
和Runnable
都没有start()
method这是错误的,Callable
和Runnable
都没有start()
method@JaySuthar,如果你找到答案,你可以接受useful@JaySuthar,如果你觉得答案有用,你可以接受