当前位置: 首页 > 知识库问答 >
问题:

使用final的线程安全性

羊舌航
2023-03-14

下面是一个解释线程安全性的示例方法:

class Counter {
    private int counter = 0;

    public void increment() {
        counter++;
    }

    public int getValue() {
        return counter;
    }
}

为了提供线程安全,有几种方法,我更喜欢使用AtomicInteger方法。然而

1.我还想知道是否可以通过对必要的变量使用final来提供线程安全。如果是,我如何执行此操作?

2.Java中经常使用final作为变量和方法参数来提供线程安全性,这是原因之一吗?

共有2个答案

闾丘朗
2023-03-14

我要把这个和Erwan Daniel的答案加在一起
如果您希望在所有线程之间共享计数器,这里是代码的另一个版本。

 class SharedCounter {
  private AtomicInteger sharedCounter ;
  
  public Counter(){
   this.sharedCounter = new AtomicInteger(0);
  }

  public void increment() {
     sharedCounter.getAndIncrement();
  }

  public int value() {
     return sharedCounter.get();
  }

最后一个将阻止你的原子弹12改变它正在使用的对象,你可以自由设置它的值。

final SharedCounter atomicInteger12 = new Counter() ;
齐乐
2023-03-14

否,final关键字与线程安全没有任何共同之处。

变量上的final关键字使它们不可变,您不能再更改它们的值。但是,它不像c中的const关键字那样,整个变量内容都不能更改。在Java中,只有引用是不可变的。

   final AtomicReference<String> toto = new AtomicReference<>("text");
   toto.set("new text"); // totally fine
   toto = new AtomicReference<>("text"); // does not compile, as toto is immutable reference.

但是,还有另一个关键字可以满足您的需求。它是易变的。https://www.baeldung.com/java-volatile

简而言之,所有线程上的值都会同时更改,并且立即可用。这就是所有Atomic*Java类中使用的内容。

前任。https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/util/concurrent/atomic/AtomicInteger.java

 类似资料:
  • 我有许多线程处理对象,其中我使用将数据库列映射到对象。 我知道在任何Java中都不是线程安全的。因此,我在中得到了一些不可预测的结果。例如,我在中也看到了。 下面是我的代码: 我的核心池大小约为20这个应用程序的最大约50。这些线程在某个时候可以处理数据库中大约100个交易记录。 使此日期格式化线程安全的最佳方法是什么?我应该使用FastDateFormat直接替换吗? 有没有更好的替代方法来确保

  • 1.1 定义 线程安全:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 线程不安全:如果一个类对象同时可以被多个线程访问,如果不做同步处理,可能表现出线程不安全现象(抛出异常、逻辑错误)。 1.2 原子性 1.2.1 定义提供了互斥访问,同一时刻(时间段)只能有一

  • 问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P

  • 假设我有一个Executors静态工厂方法的ExecutorService实例。 如果我从某个线程提交了一个调用,其中RetVal不是线程安全的本地实例化对象,那么当我从同一个线程获得()它时,我需要担心retvals的完整性吗?人们说局部变量是线程安全的,但我不确定当您返回一个本地实例化的对象并从其他线程接收它时,它是否适用。 下面是我的定制实现,我只是为了测试。您可以忽略EType枚举。

  • 在PHP初期,是作为单进程的CGI来运行的,所以并没有考虑线程安全问题。 我们可以随意的在全局作用域中设置变量并在程序中对他进行修改、访问,内核申请的资源如果没有正确的释放, 也会在CGI进程结束后自动地被清理干净。 后来,php被作为apache多进程模式下的一个模块运行,但是这仍然把php局限在一个进程里, 我们设置的全局变量,只要在每个请求之前将其正确的初始化,并在每个请求之后正确的清理干净

  • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢