Java线程安全问题:如何实现泛型Buffer接口的委托代理类
实现思路
- 首先修正成员变量的类型声明:不要用
Object存储委托对象,直接声明为Buffer<T>类型,这样可以直接调用接口定义的get/put方法,不需要额外类型转换。 - 构造函数的入参类型同步修改为
Buffer<T>,编译期就能校验传入的对象是否符合要求,避免运行时类型转换异常。如果题目强制要求入参必须是Object类型,可以在构造函数中做一次强制类型转换,最好补充类型校验逻辑避免传入非Buffer实现。 - 你已经给两个方法加了
synchronized修饰,这两个方法会使用当前对象作为锁,保证同一时间只有一个线程可以执行读写操作,天然符合线程安全要求,方法内直接委托调用s的对应方法即可。
补全后的代码
public class Threads<T> implements Buffer<T>{ // 成员变量声明为Buffer<T>类型 private final Buffer<T> s; // 构造函数入参直接指定为Buffer<T>,从编译期保证类型正确 public Threads(Buffer<T> s) { this.s = s; } @Override synchronized public void put(T t) { // 直接委托调用s的put方法 s.put(t); } @Override synchronized public T get() { // 直接委托调用s的get方法并返回结果 return s.get(); } }
特殊场景适配(如果构造函数必须接收Object类型)
如果题目强制要求构造函数入参只能是Object类型,可以按如下方式处理,注意会产生 unchecked 警告,可以用@SuppressWarnings注解抑制:
public class Threads<T> implements Buffer<T>{ private final Buffer<T> s; @SuppressWarnings("unchecked") public Threads(Object s) { // 先做类型校验,避免传入非Buffer实现导致运行时错误 if (!(s instanceof Buffer)) { throw new IllegalArgumentException("参数必须实现Buffer接口"); } this.s = (Buffer<T>) s; } @Override synchronized public void put(T t) { s.put(t); } @Override synchronized public T get() { return s.get(); } }
内容的提问来源于stack exchange,提问作者Makkador
相关产品推荐
相关产品推荐

