无状态对象 线程安全吗?

一个无状态对象的方法访问其他类的静态变量,这个时候应该线程不安全了吧。
class SharedState{
public static count;
}

class Stateless{
void dosth(){
SharedState.count++;
}
}

多个线程访问Stateless的dosth方法,这个时候线程不安全吧。

不安全,因为SharedState.count++;不是原子操作
它在微观上相当于(注意,这个代码是假想的,实际上表现为多个机器指令而不是java代码)
int temp = SharedState.count;
temp = temp + 1;
SharedState.count = temp;
也就是分为读、操作、写回3个操作
如果一个线程执行了第一个操作,被挂起,而第二个线程操作了SharedState.count,第一个线程的temp不会更新,导致脏读发生,那么它的更新会破坏数据的完整性。

首先无状态是解决线程安全的一种重要的手段,那我们应该怎么理解无状态呢?比如上面举的一个例子类名虽然是Stateless,但是显然没有理解无状态的含义。对于这个类count的值不同就是一个状态,所以这个类不能算是无状态。
最直接的无状态就是function(函数),只要是变量就一定是存在状态的,函数才是真正的无状态。
这个概念太虚了,解决多线程的方案中最基础的还是同步、锁、消息队列,无状态的解决方案只在函数式编程中数据流处理很实用,处理业务问题就不是很好建模。

无状态对象你可以理解为没有属性或不存储值的对象,http是无状态的,应该它无法保存用户信息,所以每次请求服务器无法知道两次请求是同一个人,所以
需要通过传递sessionId来告诉服务器是同一个人在请求。
SharedState.count++;再c++中可能是原子操作但在java中非原子操作,先读再写,如果要实现原子操作的功能可以将dosth放过加上syncronized进行同步,
或直接用jdk的AtomicInteger进行递增操作

无状态的一大特征是没有公共变量(哪怕是完美控制了线程安全的公共变量),你的count恰好就是个公共变量。
所谓的无状态是指一个固定的输入能得到一个稳定的输出,无论场景如何变化,这个过程都能无限重现。
无状态典型的场景就是Apache的kafka通信组件,一个固定的位点能拉取到一条固定的消息,这个操作无论重复多少次结果都不会变。相对的就是所有基于jms的mq通信组件,一次message能获取的消息取决于上一条消息的ack是否成功,message的结果永远跟着队列的消费状态变化,

你这个有点像单例模式,一个Servlet类在Application中只有一个实例存在,也就是有多个线程在使用这个实例。这是单例模式的应用。无状态的单例是线程安全的。

但是你使用了静态变量,线程安全问题都是由全局变量及静态变量引起的,所以你这个是线程不安全的。

无状态对象是线程安全的