使用jdk中的Atomic实现简单乐观锁

我们先来说一个案列,请你用20个线程有序的打印一直变量count从1递增到1000。
其实有很多种实现的方法,例如使用synchronized关键字,具体代码如下:

public class Atomic {
    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        for (int i = 0; i < 20; i++) {
            new Thread(testThread).start();
        }
    }
}

class TestThread implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        while (count < 1001) {
            synchronized (this) {
            //防止最后超过一个线程再次等候,使count超出1000
                if (count < 1001) {
                    System.out.println(count++);
                }
            }
        }
    }
}

但是在大多是实际业务场景中,这样做会使效率较低,太多线程处于等待状态,于是就来了乐观锁实现方式。
在这之前,我们先来认识一下jdk中Unsafe类,它是sun.misc包下的一个类,里面大都是native方法,直接调用c++底层函数,里面有几个方法需要说一下

public native lo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ConcurrentHashMap是Java线程安全的哈希表实现,它提供了比Hashtable和SynchronizedMap更好的并发性能和可伸缩性。 ConcurrentHashMap的实现原理主要包括以下几个方面: 1. 分段锁设计 ConcurrentHashMap将整个Map分成了多个Segment,每个Segment默认是一个长度为16的数组(可以通过构造函数指定长度)。每个Segment维护了一个HashEntry数组和一个Segment锁。在ConcurrentHashMap,所有的操作都是在Segment的粒度上进行的,不同的Segment之间可以并发操作。 2. Hash表和Hash算法 ConcurrentHashMap的底层数据结构是一个哈希表,每个元素是一个HashEntry,其包含了key、value和next指针。在ConcurrentHashMap使用了一种称为“位运算”的Hash算法,可以在不需要锁的情况下计算出每个元素的位置,从而提高了并发性能。 3. CAS操作 在ConcurrentHashMap使用了CAS(Compare And Swap)操作来保证线程安全,而不是像Hashtable和SynchronizedMap一样使用全局锁。通过CAS操作,可以在不加锁的情况下对某个元素进行修改,从而提高了并发性能。 4. Jdk1.8的改进 在Jdk1.8,ConcurrentHashMap的实现进行了一些改进,主要包括了以下几个方面: - Segment被废弃了,使用Node数组代替; - 使用了红黑树来优化链表的查找性能; - 使用了批量操作来减少CAS操作的次数,提高了并发性能。 总的来说,ConcurrentHashMap的实现原理是通过分段锁、哈希表和CAS操作来保证线程安全,同时利用了JDK1.8的一些改进来提高并发性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值