繁体   English   中英

java线程锁定变量正确

[英]java threading lock variable properly

线程A:

class A{
    public String value;
    public void methodA(String value){ //lets say value="test"
        this.value=value;
        //some code
        // Thread B interrupts
        System.out.println(value); // prints "haha" but I want it to be "test"
    }
}

线程B执行:

class B{
    public void methodB(){
        a.setValue("haha");  
    }
}

methodB和methodA是某些侦听器方法,它们在单独的线程中执行。

只要methodA还没有完成,如何确保值不变? 但我也希望事后将“ haha​​”分配给价值。 因此,我希望B等待A完成方法A,然后将“ haha​​”分配给值。

最简单的方法是在更改字段值的方法上使用“ synchronized”关键字。

例如,我们有存储数据的类:

public class Data {
   String value = "";
   public synchronized void setValue(String val) {
      this.value = val;
      System.out.println(val);
   }
}

然后线程仅使用此方法来更新值。 当时只有一个线程可以执行此方法(无中断)。

如果您想在两种方法上传播它(就像我想的那样)。 您可以使用两个选项。 或在两种方法上都使用synchronized ,或使用外部锁对象。

如果您想确保例如必须首先执行线程A,则可以使用CountDownLatch对象,该对象将停止其他线程,直到线程A不会减少锁存器为止。

有许多处理同步的方法。 您应该对要实现的目标以及要处理的场景更加精确。 例如a.setValue("haha")是A类的方法吗?

我还建议您查看有关并发的文档https://docs.oracle.com/javase/tutorial/essential/concurrency/

如果你只是想methodA()之前完成methodB()被调用时,那么你应该调用在同一个线程两种方法。 通常,如果希望程序按特定顺序执行某些操作,则最好的方法是在单个线程中完成所有操作。

另一方面,您可能希望两个线程在大多数时间都并行工作,但是有一个特定的问题,您不希望线程B在线程A到达那里之前通过。 Java标准库提供了可以使用的各种不同的同步对象。 例如, java.util.concurrent.CountDownLatch

初始化:

CountDownLatch countDownLatch=new CountDownLatch(1);
threadA.start();
threadB.start();

线程A:

doSomeStuff();
methodA();
countDownLatch.countDown();
doSomeMoreStuff();

ThreadB:

doSomeOtherStuff();
countDownLatch.await();
methodB();
doSomeMoreOtherStuff();

doSomeStuff()和doSomeOtherStuff()调用可以同时发生,而doSomeMoreStuff()和doSomeMoreOtherStuff()调用可以同时发生,但是在这种情况下,methodA()和methodB()将被序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM