Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

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

多线程无法在java中执行非同步代码

多线程无法在java中执行非同步代码,java,multithreading,synchronization,Java,Multithreading,Synchronization,如果Thread1获得锁并开始执行同步块,则Thread2可以在同一时间自由执行代码的非同步部分,即IntStream.range(0,5).forEach(x->System.out.println(“线程不安全区域,+name”) 出乎意料的是,下面是我运行代码时实际发生的情况。 解释- 假设thread1(或thread2)获得锁并执行同步块,然后thread2(或thread1)获得thread1(或thread2)释放的锁并执行同步块。两个线程完成同步块的执行后,两个线程并行开始执行非

如果Thread1获得锁并开始执行同步块,则Thread2可以在同一时间自由执行代码的非同步部分,即
IntStream.range(0,5).forEach(x->System.out.println(“线程不安全区域,+name”)

出乎意料的是,下面是我运行代码时实际发生的情况。

解释-

假设thread1(或thread2)获得锁并执行同步块,然后thread2(或thread1)获得thread1(或thread2)释放的锁并执行同步块。两个线程完成同步块的执行后,两个线程并行开始执行非同步部分。我多次运行代码,希望得到所需的输出,但没有成功

演示课

public class Demo {
    public static void main(String[] args) {

        Display d=new Display("AnyName");
        Thread1 t1=new Thread1(d);
        Thread2 t2=new Thread2(d);
        t1.start();
        t2.start();
    }
}
线程1类

public class Thread1 extends Thread {
    Display d;
    Thread1(Display d) {
        this.d = d;
    }
    @Override
    public void run() {
       d.getname("Thread 1");
    }
}
螺纹2级

public class Thread2 extends Thread {
    Display d;

    Thread2(Display d) {
        this.d = d;
    }

    @Override
    public void run() {
            d.getname("Thread 2");
    }
}
显示类

public class Display {
    String name;

    public Display(String name) {
        this.name = name;
    }

    public void getname(String name)  {
        synchronized (this) {
            IntStream.range(0, 5).forEach((idx) -> {
                System.out.println(name);
            });
            this.name=name;
        }

        IntStream.range(0, 5).forEach(x -> System.out.println("thread Unsafe Zone,"+name));// this line
//get executed only after the synchronized method completed by both thread

    }
}
输出:

Thread 2
Thread 2
Thread 2
Thread 2
Thread 2
Thread 1
Thread 1
Thread 1
Thread 1
Thread 1
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 2
如果Thread1获得锁并开始执行同步块,则Thread2可以在同一时间自由执行代码的非同步部分:不完全是

按照执行顺序,非同步块跟随同步块。因此,您将永远不会看到任何线程在同步块之前执行非同步块

你所能期望的最好的东西是

Thread 1
Thread 1
Thread 1
Thread 1
Thread 1
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 1
Thread 2
Thread 2
Thread 2
Thread 2
Thread 2
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 1
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 2
thread Unsafe Zone,Thread 2
其中线程2进入同步块,而线程1在非同步块中运行

通过调用
Thread.yield(),更改
Display.getname()
方法,可以增加出现这种结果的机会在同步块之后,通过执行更多的
System.out.println()
调用:

public void getname(String name)  {
    synchronized (this) {
        IntStream.range(0, 5).forEach((idx) -> {
            System.out.println(name);
        });
        this.name=name;
    }
    Thread.yield();

    IntStream.range(0, 20).forEach(x -> System.out.println("thread Unsafe Zone,"+name));

}

有多个cpu/核心,对吗?若是这样的话,有时您会看到一个线程开始执行非同步线程的交错。尝试在同步块中设置睡眠,然后您会看到。@ManishSharma否,示例输出显示:线程1在线程2进入同步块之前开始执行非同步块(并打印3次“线程不安全区域,线程1”)。我想说的是:在一个方法(比如
getname()
)中,如果有一个代码块a后跟一个代码块B,那么每个线程总是先执行a,然后才执行B。你的问题似乎暗示你希望第二个线程在a之前执行B,但这永远不会发生。