Immutable Object模式简介
多线程共享变量的情况下,为了保持数据的一致性,往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不使用锁的情况下,即保证共享变量访问的线程安全,又能避免引入锁可能带来的问题和开销。
实战应用:
共享自行车对车俩的位置信息进行追踪时:
1 public final class Position { 2 public final double x; 3 public final double y; 4 5 public Position(double x, double y) { 6 this.x = x; 7 this.y = y; 8 } 9 }
使用状态不可变的位置信息模型(Position)时,如果车俩的位置发生变动,则更新车俩的位置信息是通过更新整个表示位置信息的对象来实现的
public class VehicleTracker { private Map<String,Position> poMap=new ConcurrentHashMap<>(); public void updatePosition(String vehicleId,Position newPosition){ poMap.put(vehicleId,newPosition); } public Map<String, Position> getPoMap() { return poMap; } }
这样就实现了对每辆车的位置变化进行记录,使用不可变对象,在不使用锁的情况下保证了线程的安全,每次更新车俩的坐标信息时,更新的是整个对象,既X,Y始终未一个完整的坐标,使用不可变对象不表示坐标的位置始终不变,而是我们使用状态不可变的对象来对这些实体建模