Java 语言 社交消息防重的AtomicMarkableReference应用实战

Java阿木 发布于 24 天前 3 次阅读


Java 社交消息防重:AtomicMarkableReference 应用实战

在社交消息系统中,防止重复发送消息是一个常见且重要的需求。为了实现这一功能,我们可以利用 Java 的并发包中的 `AtomicMarkableReference` 类。本文将围绕这一主题,通过一个简单的社交消息系统示例,展示如何使用 `AtomicMarkableReference` 来防止消息重复。

`AtomicMarkableReference` 是 Java 并发包中的一个原子引用类,它提供了原子性的读取和更新引用的操作,并且可以跟踪引用的标记状态。在社交消息系统中,我们可以使用 `AtomicMarkableReference` 来存储消息,并通过标记状态来判断消息是否已经被处理过。

系统设计

为了简化问题,我们假设社交消息系统只支持文本消息的发送和接收。系统设计如下:

1. 消息类:定义一个简单的消息类 `Message`,包含消息内容和发送者信息。

2. 消息存储:使用 `AtomicMarkableReference` 来存储消息,并跟踪其处理状态。

3. 消息发送:发送消息时,检查消息是否已经被处理过,如果没有,则发送并更新状态。

4. 消息接收:接收消息时,检查消息是否已经被处理过,如果是,则忽略。

代码实现

1. 消息类

java

public class Message {


private final String content;


private final String sender;

public Message(String content, String sender) {


this.content = content;


this.sender = sender;


}

public String getContent() {


return content;


}

public String getSender() {


return sender;


}


}


2. 消息存储

java

import java.util.concurrent.atomic.AtomicMarkableReference;

public class MessageStore {


private final AtomicMarkableReference<Message> messageRef;

public MessageStore() {


this.messageRef = new AtomicMarkableReference<>(null, false);


}

public boolean sendMessage(Message message) {


return messageRef.compareAndSet(null, message, false, true);


}

public boolean isMessageProcessed() {


return messageRef.isMarked();


}

public void processMessage() {


messageRef.set(null, false);


}


}


3. 消息发送

java

public class MessageSender {


private final MessageStore messageStore;

public MessageSender(MessageStore messageStore) {


this.messageStore = messageStore;


}

public void sendMessage(String content, String sender) {


Message message = new Message(content, sender);


if (messageStore.sendMessage(message)) {


System.out.println("Message sent: " + content);


} else {


System.out.println("Message already processed or not sent: " + content);


}


}


}


4. 消息接收

java

public class MessageReceiver {


private final MessageStore messageStore;

public MessageReceiver(MessageStore messageStore) {


this.messageStore = messageStore;


}

public void receiveMessage() {


if (messageStore.isMessageProcessed()) {


System.out.println("Message already processed, ignoring...");


return;


}

Message message = messageStore.getMessage();


if (message != null) {


System.out.println("Received message: " + message.getContent());


messageStore.processMessage();


}


}


}


测试

java

public class Main {


public static void main(String[] args) {


MessageStore messageStore = new MessageStore();


MessageSender sender = new MessageSender(messageStore);


MessageReceiver receiver = new MessageReceiver(messageStore);

sender.sendMessage("Hello, World!", "Alice");


receiver.receiveMessage(); // Should print "Received message: Hello, World!"

sender.sendMessage("Hello, World!", "Alice"); // Should print "Message already processed or not sent: Hello, World!"


receiver.receiveMessage(); // Should print "Message already processed, ignoring..."


}


}


总结

本文通过一个简单的社交消息系统示例,展示了如何使用 `AtomicMarkableReference` 来防止消息重复。在实际应用中,可以根据具体需求对系统进行扩展和优化。例如,可以增加消息持久化、消息队列等功能,以提高系统的可靠性和性能。