同步关键字和竞争条件在java中产生了意外错误 我只是在java中启动线程的基础。同步关键字告诉调度器在线程执行的中间不进行上下文切换。此外,当多个线程试图访问同一资源时,会发生争用情况。考虑到这一点,我创建了一个简单的类来向自己演示这个概念 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(); } } }
为什么会这样?类中的同步关键字和竞争条件在java中产生了意外错误 我只是在java中启动线程的基础。同步关键字告诉调度器在线程执行的中间不进行上下文切换。此外,当多个线程试图访问同一资源时,会发生争用情况。考虑到这一点,我创建了一个简单的类来向自己演示这个概念 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(); } } },java,multithreading,concurrency,Java,Multithreading,Concurrency,为什么会这样?类中的start()方法具有以下行: if (threadStatus != 0) throw new IllegalThreadStateException(); threadStatus用于表示给定线程的状态。如果为0,则表示线程尚未启动。上面的代码意味着,如果您试图在已经运行的线程上调用start(),将抛出IllegalThreadStateException 发生特定错误的原因是,您对给定线程多次调用start()方法t1和t2您不能多次启动同
start()
方法具有以下行:
if (threadStatus != 0)
throw new IllegalThreadStateException();
threadStatus
用于表示给定线程的状态。如果为0,则表示线程
尚未启动。上面的代码意味着,如果您试图在已经运行的线程上调用start()
,将抛出IllegalThreadStateException
发生特定错误的原因是,您对给定线程多次调用start()
方法t1
和t2
您不能多次启动同一线程。
此代码:
for (int k = 0; k <=100; k++) {
t1.start();
t2.start();
}
<代码> >(int k=0);k,你的意思是我从T1,T2开始不止一次?这个问题与同步关键字无关。你应该考虑从标题中删除它。“要执行这些线程100次”,如果这个代码有效,它将执行101次。
for (int k = 0; k <=100; k++) {
t1.start();
t2.start();
}