Java 线程安全问题

Posted

技术标签:

【中文标题】Java 线程安全问题【英文标题】:Java Thread safety questions 【发布时间】: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。唯一缺少的是问号。我会添加它们......如果它让你开心。 【参考方案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 方法,但它们在类型级别上没有相互关联。)

【讨论】:

以上是关于Java 线程安全问题的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程线程安全和非线程安全

java priorityblockingqueue 线程安全吗

java多线程之线程安全

Java+线程内部调用实例方法会多线程安全吗?

温故Java基础多线程编程—线程安全

Java线程安全