通用同步代码块[没有ObjectLocking]

时间:2018-01-06 23:47:09

标签: java multithreading

这是我提出的一个简单的代码来说明我的问题:

public class Main {
    public static void main(String[] args) {
        int sleepTime = 10, N = 1000;
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < N; i++) {

                { //BLOCK 1
                    //I want these two instructions to run one right after the other one
                    System.out.println("Thread one rules!!");
                    System.out.println("Im in 1!!!\n");
                }

                try {
                    Thread.sleep(sleepTime); //I also tried yield
                } catch (InterruptedException e) {}
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < N; i++) {

                { //BLOCK 2
                    //I want these two instructions to run one right after the other one
                    System.out.println("Thread two rules!!");
                    System.out.println("Im in 2!!!\n");
                }

                try {
                    Thread.sleep(sleepTime); //I also tried yield
                } catch (InterruptedException e) {}
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();
    }
}

有没有办法让每个块被称为&#34;原子地&#34;?意思是&#34;线程规则!!&#34;总是会出现在#1;我在1 !!!&#34;

Output example image

我不想在同步块中使用任何虚拟对象,也不想使用任何等待/通知语句。我想要一个可以同时运行数百个线程的实现。我尝试使用将公共对象作为参数mySocketServer的synchronized语句,但它开始给我时间问题。

提前致谢

2 个答案:

答案 0 :(得分:3)

最相关的方法是使用一个电话:

System.out.println("<first line>\n<second line>");

顺便说一下,我认为时序不应受其他同步块的影响。无论如何,您可以使用System.out

synchronized(System.out) {
...
} 

这绝对不应该影响时机。像println()这样的PrintStream方法已经包含了这样的同步,因此这个额外的同步块将优化锁定。

答案 1 :(得分:1)

不,你必须锁定System.out以防止 线程规则!! 线程两个规则!!

即使锁定每个块也允许两个线程同时写入System.out