【问题标题】:Why synchronize keyword in java is not working without join()为什么 java 中的 synchronize 关键字在没有 join() 的情况下不起作用
【发布时间】:2021-06-04 09:17:49
【问题描述】:

如果我在这里注释 t1.join,t2.join,下面的代码没有给出 counter=200 的结果,我假设我们在 increment() 方法中有 synchronized 关键字,这会让一个线程允许进入 increment() 方法,假设 t1 被允许,然后 t1 使计数器变为 100,然后 t1 完成,然后 t2 将获得锁并获取已更新的计数器值 100,然后开始从 101 递增到 200 但如果我评论加入方法然后该程序无法正常工作 预计

非常感谢您抽出宝贵时间帮助我理解这一点

public class InterthreadExp1 {

    private static int counter =0;

    public static synchronized void increment() {
        counter++;
    }

    public static void process() {

        Thread t1 = new Thread(new Runnable() {

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

            }
        });


        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    increment();
                }

            }
        });

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

        
        /*
         * try { t1.join(); t2.join(); } catch (InterruptedException e) {
         * e.printStackTrace(); }
         */
         
    }

    public static void main(String[] args) {
        process();
        System.out.println("Couter value "+counter);

    }

}

【问题讨论】:

  • 同步在哪里?
  • 您的代码中没有synchronized 方法/块。
  • 一定是synchronized 不起作用的原因;)
  • 对不起,我忘了补充。现在我已经添加了
  • @BalanjaneyuluP 您想在两个线程都完成时打印结果。因此,将t1.start(); t2.start() 更改为t1.start(); t2.start(); t1.join(); t2.join();

标签: java multithreading


【解决方案1】:

这里如果我们注释掉 t1.join 和 t2.join 方法,那么 t1 线程或 t2 线程启动并执行增量方法,同时主线程也在完成 t1 或 t2 的操作之前打印计数器值

如果我们取消注释连接语句,那么主方法将等到时间 t1 和 t2 线程完成,然后只有主线程会打印计数器值,这会给我们预期的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多