Ζℤ 2024-09-24 00:52 采纳率: 87.5%
浏览 32
已结题

Java中的并发编程:实现一个线程安全的栈

在Java并发编程中,确保数据在多线程环境下的安全性是至关重要的。栈(Stack)作为一种后进先出(LIFO)的数据结构,在并发环境下其操作(如push、pop)如果不加以适当的同步控制,很容易引起数据不一致的问题。

设计一个线程安全的栈(Thread-Safe Stack),要求支持以下操作:

  1. push(E item): 将元素压入栈顶。
  2. pop(): 移除并返回栈顶元素;如果栈为空,则返回null或抛出异常(视设计而定)。
  3. peek(): 返回栈顶元素但不移除它;如果栈为空,则返回null或抛出异常(视设计而定)。
  • 写回答

2条回答 默认 最新

  • 小ᶻ☡꙳ᵃⁱᵍᶜ꙳ 优质创作者: 人工智能技术领域 2024-09-24 22:04
    关注
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.EmptyStackException;
    
    public class ThreadSafeStack<E> {
        private Node<E> top;
        private ReentrantLock lock = new ReentrantLock();
    
        private static class Node<E> {
            E value;
            Node<E> next;
    
            Node(E value) {
                this.value = value;
            }
        }
    
        // push: 将元素压入栈顶
        public void push(E item) {
            lock.lock();
            try {
                Node<E> newNode = new Node<>(item);
                newNode.next = top;
                top = newNode;
            } finally {
                lock.unlock();
            }
        }
    
        // pop: 移除栈并返回栈顶元素,如果栈为空,返回null或抛出异常
        public E pop() {
            lock.lock();
            try {
                if (top == null) {
                    throw new EmptyStackException();
                }
                E value = top.value;
                top = top.next;
                return value;
            } finally {
                lock.unlock();
            }
        }
    
        // peek: 返回栈顶元素但不移除它,如果栈为空,返回null或抛出异常
        public E peek() {
            lock.lock();
            try {
                if (top == null) {
                    throw new EmptyStackException();
                }
                return top.value;
            } finally {
                lock.unlock();
            }
        }
    
        // 判断栈是否为空
        public boolean isEmpty() {
            lock.lock();
            try {
                return top == null;
            } finally {
                lock.unlock();
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月2日
  • 已采纳回答 9月24日
  • 创建了问题 9月24日