【问题标题】:Java Thread safety questionsJava 线程安全问题
【发布时间】:2021-12-16 18:07:38
【问题描述】:

我遇到了一个练习,但我不是知道如何实现它的 Java 专家。我的目标是实现一个具有 getter 和 setter 方法的通用接口。在它的构造函数中,我必须放置一个实现这个通用接口的 s 对象。我们必须将此对象存储在我们的类中,并使用该类的 getter 和 setter 来实现我们的类 getter 和 setter(delegation)。

public class Threads<T> implements Buffer<T>{
    Object s;
    public Threads(Object s) { // we know, that It implements our Buffer interface
        this.s=s;//i have no clue to what I should convert it.
    }
    
    synchronized public void put(T t) {
        //i don't know how to call s's put method
    }
    synchronized public T get() {
        //I don't know how to call s's get method.
        
    }
    
}

我的问题是:如何处理上面我在 cmets 中指出我不知道该写什么的代码部分?

有什么想法吗?

【问题讨论】:

  • 如果你有两个问题,你应该分开问。
  • @Makkador - 我会和你讨价还价。编辑您的问题以删除其中一个问题,然后我将尝试理解并回答另一个问题。否则,问题可能会被关闭......没有任何答案。
  • 好小子... :-)
  • 我回滚了编辑并进行了编辑,因此提出了第一个问题,因为您之前的编辑没有提出问题。
  • 我已回滚您的回滚,因为它使我对修改后问题的回答变得毫无意义。马克 - 你应该知道得更好!有明确的问题提出。查看代码 cmets。唯一缺少的是问号。我会添加它们......如果它让你开心。

标签: java multithreading synchronization thread-safety


【解决方案1】:

我假设您所指的“它”是s 参数。

您需要声明s 参数和s 类型为Buffer&lt;T&gt; 的字段。像这样的:

public class Threads<T> implements Buffer<T>{
    Buffer<T> s;

    public Threads(Buffer<T> s) { 
        this.s = s;
    }
    
    synchronized public void put(T t) {
        s.put(t);
    }

    synchronized public T get() {
        return s.get();
    }
}

此时您已经为Buffer&lt;T&gt; 实现了一个线程安全的包装器。但是对于使用包装方法执行的操作,它只是线程安全的。

(这个Buffer&lt;T&gt;类/接口一定是你自己设计的。标准的java.nio.Buffer类没有参数化,也没有提供getput方法。@的子类987654331@ 确实有 getput 方法,但它们在类型级别上没有相互关联。)

【讨论】: