首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java细粒度实现的3种方式

Java细粒度实现的3种方式 最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响。...而java自身api提供的粒度太大,很难同时满足这些需求,于是自己动手写了几个简单的扩展… ? 1....哈希 上述分段的基础上发展起来的第二种策略,目的是实现真正意义上的细粒度。每个哈希值不同的对象都能获得自己独立的。在测试中,在被锁住的代码执行速度飞快的情况下,效率比分段慢 30% 左右。...弱引用 哈希因为引入的分段来保证创建和销毁的同步,总感觉有点瑕疵,所以写了第三个来寻求更好的性能和更细粒度。...,写着写着发现正在实现的东西和java 原生的区别不大,于是放弃改为对java自带的封装,浪费了不少时间。

2.7K90

Java

java中的乐观基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。...java中的悲观就是Synchronized,AQS框架下的则是先尝试cas乐观去获取,获取不到,才会转换为悲观,如RetreenLock。...java中的 1.自旋 自旋原理非常简单,如果持有的线程能在很短时间内释放资源,那么那些等待竞争的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有的线程释放后即可立即获取...synchronized会导致争用不到的线程进入阻塞状态,所以说它是java语言中一个重量级的同步操纵,被称为重量级,为了缓解上述性能问题,JVM从1.5开始,引入了轻量与偏向,默认启用了自旋...偏向 Java偏向(Biased Locking)是Java6引入的一项多线程优化。

1.6K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JAVA

    java 中的乐观基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入 值是否一样,一样则更新,否则失败。...java中的悲观就是Synchronized,AQS框架下的则是先尝试cas乐观去获取,获取不到, 才会转换为悲观,如 RetreenLock。...3.自旋 自旋原理非常简单,如果持有的线程能在很短时间内释放资源,那么那些等待竞争 的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋), 等持有的线程释放后即可立即获取...但是如果的竞争激烈,或者持有的线程需要长时间占用执行同步块,这时候就不适合 使用自旋了,因为自旋锁在获取前一直都是占用 cpu 做无用功,占着 XX 不 XX,同时有大量 线程在竞争一个,会导致获取的时间很长...所以这种情况下我们要关闭自旋;自旋时间阈值(1.6 引入了适应性自旋) 自旋的目的是为了占着 CPU 的资源不释放,等到获取到立即进行处理。但是如何去选择 自旋的执行时间呢?

    68110

    JAVA

    悲观 & 乐观悲观:认为多个线程访问同一个共享变量冲突的概率较大,会在每次访问共享变量之前都去真正加锁。Java中的 synchronized 和 ReentrantLock就是悲观。...Java中的CAS就是乐观,比较当前值(主内存中的值)与预期值(当前线程中的值,主内存中值的一份拷贝)是否一样,一样则更新,否则继续进行CAS操作。...读写Java 标准库提供了 ReentrantReadWriteLock 类, 实现了读写。...自旋如果获取失败,立即再尝试获取,无限循环,直到获取到为止。第一次获取失败,第二次的尝试会在极短的时间内到来,一旦被其他线程释放,就能第一时间获取到。...同步同步表示并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。在java中 synchronized 就是同步

    6200

    java的各类

    可重入递归,同一个线程,外层函数获得,内层的也获得。...finally { lock.unlock(); } }}多线程的判断用while if只适合两个线程的判断synchronized和lock的区别参考文章存在层次上synchronized: Java...的关键字,在jvm层面上Lock: 是一个接口的释放synchronized: 1、以获取的线程执行完同步代码,释放 2、线程执行发生异常,jvm会让线程释放Lock: 在finally中必须释放...: 在发生异常时候会自动释放占有的,因此不会出现死锁Lock: 发生异常时候,不会主动释放占有的,必须手动unlock来释放,可能引起死锁的发生的状态synchronized: 无法判断Lock...当线程执行遇到monitorenter指令时会尝试获取内置,如果获取计数器+1,如果没有获取则阻塞;当遇到monitorexit指令时计数器-1,如果计数器为0则释放

    19750

    javacas(java的实现原理)

    一、 Java 1.常见的有synchronized和Lock() ①synchronized 是jvm层面实现的,可以直接用,不过要锁住某个对象;lock是属于j.u.c包下的接口,用的时候要实现...@lock与synchronized相比,lock添加一些其他特性,如中断等候和定时等候。...2.悲观与乐观 ①悲观认为世界是悲观的,当去拿数据的时候就上锁,这样别人想拿这个就会阻塞直到拿到,传统的数据库用到了这种,像行,表等,读,写等,都是在做操作之前先上锁。...再比如Java里面的同步原语synchronized关键字的实现也是悲观。 ②乐观,认为一般并发是不会发生的,所以不会上锁。...基于CAS(无编程)实现,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制(解决ABA问题)。乐观适用于多读的应用类型,这样可以提高吞吐量。

    55420

    Java死锁、活,悲观、乐观

    Java中导致饥饿的原因:  高优先级线程吞噬所有的低优先级线程的CPU时间。  线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。 ...传统的关系型数据库里边就用到了很多这种机制,比如行,表等,读,写等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观。...在Javajava.util.concurrent.atomic包下面的原子变量类就是使用了乐观的一种实现方式CAS实现的。...java中的Compare and Swap即CAS ,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,...从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。

    47030

    java中方法、对象、类、静态

    synchronized关键字,我们一般称之为“同步”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为的对象。...在用类修饰synchronized时(或者修饰静态方法),默认是当前类的Class对象作为的对象,故存在着方法、对象、类这样的概念。 先给出以下代码感受下代码执行的时候为什么需要同步?...其他线程打不开这个,只能在外边等该线程释放掉该,一般都都是执行玩所有代码逻辑主动释放),表示此方法是当前线程独占的,对应到上述业务中就是一次只能有一个队列报数。...numberOff(); }, "队列" + i).start(); } } } 代码执行结果如下: 最后用线程池将上述代码写一下: package ioo; import java.util.concurrent.ExecutorService...; import java.util.concurrent.Executors; class SynchronizedExample { protected static int num =

    19620

    Java的乐观,悲观,读写,递归

    我们都知道在 Java 中为了保证一些操作的安全性,就会涉及到使用,但是你对 Java了解的有多少呢?Java 都有哪些?以及他们是怎么实现的,今天了不起就来说说关于 Java。...在 Java 中,乐观通常是通过版本号、时间戳或其他状态信息来实现的。以下是乐观锁在 Java 中的一些常见实现方式: 版本号机制: 数据表中增加一个“版本号”字段。 读取数据时,同时读取版本号。...ReentrantLock类: Javajava.util.concurrent.locks.ReentrantLock类提供了重入的实现,这是一种悲观。...递归 Java中的递归(ReentrantLock)是java.util.concurrent.locks包下提供的一种可重入的互斥,它是悲观的一种实现。...读写 Java中的读写(ReadWriteLock)是一种允许多个读线程和单个写线程访问共享资源的同步机制。

    22000

    Java synchronized之类对象

    参考链接: 了解Java中的类和对象 前言      之前看到过一篇文章,写的就是Java关键字synchronized的类和对象,今天想重温一下无奈发现文章已经搜索不到,百度之大部分都是重复的那么几篇文章...于是重写一篇博客介绍 synchronized 类 对象。  Java原生提供了 synchronized 关键字用于多线程编程,但往往入门使用者在发现使用情况与预期有差别,可阅读此文章。 ...Java的 synchronized 的是对象,也只对象: 对象是基于对堆内存内对象的头部加锁信息; 类是基于对类对应的 java.lang.Class对象加锁信息; 特别的, synchronized...例如 ReentrantLock是基于Java关键字volatile和CPU的CAS机制来实现的,若有知晓可在留言区告知一二 *)  类原理及为何类完全互斥  可优先阅读该篇文章图解Java类加载机制...  想获得一个Java的对象,则需要先获得Java的一个类,这便是Java的类加载。

    2K00

    java redis_Java中Redis的实现

    由于具体业务场景的需求,需要保证数据在分布式环境下的正确更新,所以研究了一下Java中分布式的实现。...Java分布式的实现方式主要有以下三种: 数据库实现的乐观 Redis实现的分布式 Zookeeper实现的分布式 其中,较常用的是前两种方式,但是数据库实现方式需要较多的数据库操作,所以最终选择的是用...第一,Redis需要有一个超时时间,这样即便某个持有的节点挂了,也不到导致其他节点死锁,保证每个有一个UniqueId;第二,每个需要有一个UniqueId,确保当一个线程执行完一个任务去释放的时候释放的一定是自己的...,否则可能存在一种场景,就是一个线程释放的时候,它的可能已经超时被释放了,而因为缺少一个UniqueId,它却释放了另一个线程的 基于以上两点的考虑,分别设计了获取和释放的api。...若做check的时候,检查得到确实是这个的UniqueId,但是在执行del方法之前,这个已经超时,然后新的线程也已经获取到了,那么del删掉的,便不是自己的,而是下一个线程的

    2K20

    Java---偏向、轻量级、自旋、重量级

    java中的悲观就是Synchronized,AQS框架下的则是先尝试cas乐观去获取,获取不到,才会转换为悲观,如RetreenLock。...明确java线程切换的代价,是理解java中各种的优缺点的基础之一。...基础知识之三:markword 在介绍java之前,先说下什么是markword,markword是java对象数据结构中的一部分,要详细了解java对象的结构可以点击这里,这里只做markword的详细介绍...了解了markword结构,有助于后面了解java的加锁解锁过程; 小结 前面提到了java的4种,他们分别是重量级、自旋、轻量级和偏向,  不同的有不同特点,每种只有在其特定的场景下...偏向 Java偏向(Biased Locking)是Java6引入的一项多线程优化。

    2.1K30

    Java

    Java中的分很多种类,按照场景的不同、特性的不同等分为了很多类,下面就来讲讲Java的概念: 自旋:是指当一个线程在获取的时候,该已经被其他线程占用,则该线程会循环等待,并会不断检查是否成功获取...Java中悲观和乐观的实现 在Java语言中,对于悲观和乐观有不同的实现。 synchronized关键字和Lock相关实现类都是悲观。...只要一个线程获取到了对象的,会修改对象头中的Mark Word状态,同时线程中也会保存对应的状态。 而Java中的乐观最常采用的是CAS算法。...悲观和乐观的应用场景 悲观适用于写多读少的场景,操作资源的时候先加锁可以保证资源的正确性 乐观适用于读多写少的场景, 不加锁可以让读取数据的效率大幅增强 自旋和适应性自旋 阻塞或唤醒一个Java...无、偏向、轻量级和重量级 这四种是针对synchronized关键字提出的,在说这四种之前先来简单介绍一个重要的知识点:Mark Word Mark Word是保存在Java对象头中的数据,

    29020

    Java优化

    线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的。 2. Java对象头 存在Java对象头里。...Java对象头里的Mark Word里默认存储对象的HashCode,分代年龄和标记位。32位JVM的Mark Word的默认存储结构如下: ?...Java SE1.6为了减少获得和释放所带来的性能消耗,引入了“偏向”和“轻量级”,所以在Java SE1.6里一共有四种状态,无状态,偏向状态,轻量级状态和重量级状态,它会随着竞争情况逐渐升级...偏向的设置 关闭偏向:偏向锁在Java 6和Java 7里是默认启用的,但是它在应用程序启动几秒钟之后才激活,如有必要可以使用JVM参数来关闭延迟-XX:BiasedLockingStartupDelay.../how-the-java-virtual-machine-performs-thread-synchronization.html http://www.infoq.com/cn/articles/java-se

    93110

    Java 专题

    Java中的synchronized是非公平,ReentrantLock默认的lock方法采用的是非公平。...Java的ReentrantLock和synchronized都是可重入。 共享和独占 java并发包提供的加锁模式分为共享和独占。...ReadWriteLock 读写 为了提高性能,Java提供了读写,在读的地方使用读,在写的地方使用写,灵活控制。如果没有写的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。...Java读写有对应的接口java.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock。...补充相关知识: Java中的偏向,轻量级, 重量级解析 分段 ConcurrentHashMap,JDK7及之前实现同步的一种方式,对整个数组分段加锁,不是一种实际的

    34950

    Java机制

    上一篇简略说了一下Synchronized和Lock,今天就来说一下Java机制。...Java机制主要分为四种,分别是 (1)公平、非公平 (2)可重入 (3)自旋 (4)共享、独占 接下来一一说一下这四种 一、公平、非公平 (1)公平:指多个线程按照申请的顺序来获取...公平: ? 非公平: ? 二、可重入(又叫递归) (1)是指同一线程外层函数获取之后,内层递归函数仍然能持有继续运行。...(2)共享:指可以同时被多个线程持有。...对于ReentrantReadWriteLock来说,其由ReadLock(写)和WriteLock(读),其中写是独占,读是共享,保证高并发。读写,写读,写写的过程是互斥的。

    74920

    java 文件

    竞争同一文件的两个线程可能在不同的 Java 虚拟机上,或者一个是 Java 线程,另一个是操作系统中的某个本地线程。...文件对其他的操作系统进程是可见的,因为 Java 的文件加锁直接映射到了本地操作系统的加锁工具(通过文件进行加锁)。...java文件要么独占,要么共享。 共享:允许多个线程对文件进行读操作。...) 是非阻塞式的,它设法获取,但如果不能获得,例如因为其他一些进程已经持有相同的,而且不共享时,抛出文件重叠异常【OverlappingFileLockException】。...OverlappingFileLockException 单个 Java 虚拟机在某个特定文件上所保持的锁定、不同 jvm 或者不同操作系统获取同一文件时,先拿到的获得,后获取的抛出文件重叠异常

    94020

    最全Java详解:独享共享+公平非公平+乐观悲观

    最全Java详解:独享/共享+公平/非公平+乐观/悲观Java并发场景中,会涉及到各种各样的如公平,乐观,悲观等等,这篇文章介绍各种的分类: 公平/非公平 可重入...乐观适用于多读的应用类型,乐观锁在Java中是通过使用无编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。...最全Java详解:独享/共享+公平/非公平+乐观/悲观 3.总之: 悲观适合写操作多的场景,先加锁可以保证写操作时数据正确。...最全Java详解:独享/共享+公平/非公平+乐观/悲观 3.典型应用: java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平和非公平(...Java线程 详细可以参考:高并发编程系列:4种常用Java线程的特点,性能比较、使用场景 本文标题:最全Java详解:独享/共享+公平/非公平+乐观/悲观 转载请保留页面地址:http

    64820
    领券