同步的关键字和竞争条件在Java

时间:2019-05-03 19:49:11

标签: java multithreading concurrency

我只是在Java中启动线程基础知识.synced关键字告诉调度程序在线程执行过程中不要进行上下文切换。另外,当更多线程尝试访问同一资源时,就会发生竞争状态。考虑到这一点,我创建了一个简单的类来向我自己演示这个概念。

public class DemoThread{

    int i = 1;

    public void runThreads() {

        Thread t1 = new Thread(new Runnable () {
            @Override 
            public void run() {
                synchronized(this) {
                    i++;
                    System.out.println("Thread 1: " + i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(this) {
                    i--;
                    System.out.println("Thread 2: " + i);
                }
            }
        });

        for (int k = 0; k <=100; k++) {
            t1.start();
            t2.start();
        }
    }
}

我只是在底部有一个forloop来执行这些线程100次。但是,我在控制台中收到此错误:

Thread 2: 1Exception in thread "main" 
Thread 1: 1
java.lang.IllegalThreadStateException
    at java.base/java.lang.Thread.start(Thread.java:795)
    at thread_demo.DemoThread.runThreads(DemoThread.java:31)
    at thread_demo.main.main(main.java:9)

那是为什么?

3 个答案:

答案 0 :(得分:2)

start()类中的Thread方法具有以下几行:

 if (threadStatus != 0)
            throw new IllegalThreadStateException();

threadStatus用于表示给定Thread的状态。如果为0,则表示Thread尚未启动。上面的代码意味着,如果您尝试在已经运行的start()上调用Thread,则会抛出IllegalThreadStateException

发生特定错误的原因是,对于给定线程start()t1,您多次调用t2方法

答案 1 :(得分:2)

此代码:

        for (int k = 0; k <=100; k++) {
            t1.start();
            t2.start();
        }

多次启动t1t2。这是禁止的。

答案 2 :(得分:1)

您不能多次启动同一线程。
Example