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_Thread Safety_Locking - Fatal编程技术网

Java 锁外螺纹还是锁内螺纹?

Java 锁外螺纹还是锁内螺纹?,java,multithreading,thread-safety,locking,Java,Multithreading,Thread Safety,Locking,我正在学习线程安全,在网上搜索时似乎找不到问题的明确答案 这两者之间的区别和影响是什么: synchronized (lock) { new Thread () { public void run() { // critical section } }.start(); } 这是: new Thread () { public void run() { synchronized (lock) {

我正在学习线程安全,在网上搜索时似乎找不到问题的明确答案

这两者之间的区别和影响是什么:

synchronized (lock) {
    new Thread () {
        public void run() {
            // critical section
        }
    }.start();
}
这是:

new Thread () {
    public void run() {
        synchronized (lock) {
            // critical section
        }
    }
}.start();
为了给您一个上下文,我正在编写一个小型实验室,方法是“每个请求一个线程”,因此每次调用该方法时,上面的任何一个都会执行到“关键部分”,并在它自己的线程中执行


那么,在线程内部或外部设置锁会产生影响吗?每个线程是“继承”锁还是必须在每个线程内才能完全实现线程安全

同步仅仅意味着一次只有一个线程可以执行代码的某些部分

在第一个示例中,一次只有一个线程可以创建和启动新线程。但是请注意,您没有保护关键部分,因为多个线程可以同时执行其run方法

synchronized (lock) {
    new Thread () {
        public void run() {
            // critical section
        }
    }.start();
}
在第二个示例中,多个线程可以创建并启动一个新线程,但一次只有一个线程可以执行受锁保护的关键部分

new Thread () {
    public void run() {
        synchronized (lock) {
            // critical section
        }
    }
}.start();

第一个是无用的。第一个在thread.start之后释放锁,第二个是正确的,在释放锁之前等待run方法中的所有代码完成!谢谢:为什么要在自己的线程中运行一个关键部分?关键部分的要点是,同一时间只能有一个线程,那么为什么不在您所在的线程中运行该部分,而不是运行一个新线程呢?新线程没有任何好处,许多缺点需要更长的时间,更多的内存使用,更多的垃圾被收集。编辑的意图是这样的。如果我给你完整的背景,你会明白的。这只是一个摘录;对于详细的解释,您可以得到以下答案: