返回信息流「更新」:
目前得到的方案应该是在声明 top 的时候使用原子类就可以解决了。
或者是借鉴 ConcurrentHashMap 的实现,真的好像。。。将 top 声明为 volatile, 这样写线程对 top 的改变不影响其他并发读线程获取 top 值;其他结构性的修改方法 直接加锁就可以了。
这两种方案应该是 前者的效率会更高一些。具体为啥,我也不知道。。。
--------------
前几天面试问到的一个问题,我当时想的是给 pop push 之类的操作加上 对象锁 就行了。
但是感觉应该不是很好,数组使用 top 来维护当前栈顶的元素位置。这个 top 是否可以用到 原子类 或者 volatile
用 volatile 的话,是否 getTop 的方法就不用加锁了
之前工作一直用的脚本语言,最近准备换 Java 了,这些概念分得不是很清,好艰难。。。。
这是一条镜像帖。来源:北邮人论坛 / java / #59194同步于 2018/5/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】如何用数组实现一个线程安全的栈?
Enzyme
2018/5/16镜像同步23 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 faith 的大作中提到: 】
: volatile不具有原子性,还是得加锁吧
嗯,我想的是 如果 top 设置成 volatile 的话,获取栈顶元素的方法 getTop 就不用加锁了,这样一定是拿到的最新的值。
还有如果一开始 top 就设置成 AtomicInteger top 的话,push 和 pop 操作是不是也不用加锁了呢。。。
【 在 dss886 的大作中提到: 】
: pop和push加锁吧,volatile不行
getTop 获取栈顶元素的也要加锁吧,纠结的是用 volatile 的话,getTop的这个锁就没必要加了。。。。[ema0]
可以volatile加cas,push,pop操作应该都不用加锁了,详情键jdk8,concurrenthashMap扩容代码,跟你这个的场景感觉挺类似的