java多线程:注释部分保证计数器同步及其原因 公共类计数器线程扩展线程{ 专用静态整数计数器=0; @凌驾 公开募捐{ 对于(int i=0;i

java多线程:注释部分保证计数器同步及其原因 公共类计数器线程扩展线程{ 专用静态整数计数器=0; @凌驾 公开募捐{ 对于(int i=0;i,java,Java,start()和immediatejoin()表示按顺序执行线程,而不是并行执行。静态变量的顺序修改不会引入并发修改问题,因此代码是安全的。但它并不是这个术语通常意义上的“多线程”:)在不同线程上顺序执行,如果没有适当的同步,仍然会导致数据竞争。正是由于join引入了发生在关系之前的事实,才使得这种关系起作用。在每个线程中使用一个简单的延迟循环来确保它们按顺序运行是不可能的。这两点基本上都是正确的。上面的代码是“串行”而不是并行的。但是Java仍然需要在之前发生,以保证在单独的线程上可以看到写操

start()
和immediate
join()
表示按顺序执行线程,而不是并行执行。静态变量的顺序修改不会引入并发修改问题,因此代码是安全的。但它并不是这个术语通常意义上的“多线程”:)

在不同线程上顺序执行,如果没有适当的同步,仍然会导致数据竞争。正是由于
join
引入了发生在关系之前的事实,才使得这种关系起作用。在每个线程中使用一个简单的延迟循环来确保它们按顺序运行是不可能的。这两点基本上都是正确的。上面的代码是“串行”而不是并行的。但是Java仍然需要在之前发生,以保证在单独的线程上可以看到写操作,并且
join
后跟
start
确保这一点。
public class CounterThread extends Thread {

        private static int counter = 0;

        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {

                counter++;
            }
        }

        public static void main(String[] args) throws InterruptedException {
            int num = 1000;
            Thread[] threads = new Thread[num];
            for (int i = 0; i < num; i++) {
                threads[i] = new CounterThread();
                threads[i].start();

// The comment section guarantees counter synchronization and why. .
--------------------------------------------------------------------

                //threads[i].join();
            }
            for (int i = 0; i < num; i++) {
                threads[i].join();
            }
            System.out.println(counter);
        }
    }