You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:27:00