To write thread-safe code, the core lies in managing state access operations, especially access to shared and mutable states. When multiple threads access a state variable and one thread performs a write operation, a synchronization mechanism must be used to coordinate the access of these threads to the variable. Stateless objects must be thread-safe.
What happens if we add a state to a stateless object?
Suppose we add a "hit counter" to the servlet to manage the number of requests in the following way: add a long type field to the servlet, and add 1 to this value every time a request is processed.
public class UnsafeCountingFactorizer implements Servlet { private long count = 0; public long getCount() { return count ; } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // do something count++; } }
Unfortunately, the above code is not thread-safe because count is not an atomic operation. In fact, it contains three separate operations: reading the value of count, adding 1 to the value, and then The calculation result is written into count. If thread A reads that count is 10, thread B immediately reads that count is also 10. Thread A adds 1 and writes to 11. Thread B has already read that count is 10, so after adding 1 and writing, it is still 11. A count is thus lost.
In concurrent programming, this kind of incorrect result due to improper execution timing is a very important situation. It has a formal name: race condition. The most common type of race condition is the "check first and then execute" operation, that is, a possible invalid observation result is used to determine the next operation.
Delayed initialization is a common situation of race conditions:
public class LazyInitRace { private SomeObject instance = null; public SomeObject getInstance() { if(instance == null) instance = new SomeObject(); return instance ; } }
Contains race conditions in LazyInitRace: First, thread A determines that instance is null, then thread B determines that instance is also null, and then thread A and thread B create objects respectively, so that the object undergoes two processes. An error occurred during initialization.
To avoid static conditions, when a thread modifies a variable, it is necessary to prevent other threads from using this variable in some way, thereby ensuring that other threads can only read and modify the state before or after the modification operation is completed. , rather than in the process of modifying the state.
In the UnsafeCountingFactorizer example, the reason why the thread is unsafe is that count is not an atomic operation. We can use an atomic class to ensure that the addition operation is atomic.
In this way, the class is thread-safe:
public class CountingFactorizer implements Servlet { private final AtomicLong count = new AtomicLong(0); public long getCount() { return count .get() ; } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // do something count.incrementAndGet(); } }
AtomicLong is an atomic variable class in the java.util.concurrent.atomic package. It can implement atomic self-increment operations, so it is thread-safe.
Related learning recommendations: java basic tutorial
The above is the detailed content of What classes in Java are thread safe?. For more information, please follow other related articles on the PHP Chinese website!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 English version
Recommended: Win version, supports code prompts!

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)
