学习
实践
活动
专区
工具
TVP
写文章

乐观和悲观实现(java乐观实现)

Java/准备 Java 面试 ,首选 JavaGuide。 何谓悲观与乐观 乐观对应于生活中乐观的人总是想着事情往好的方向发展,悲观对应于生活中悲观的人总是想着事情往坏的方向发展。 传统的关系型数据库里边就用到了很多这种机制,比如行,表等,读,写等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占就是悲观思想的实现。 在Javajava.util.concurrent.atomic包下面的原子变量类就是使用了乐观的一种实现方式CAS实现的。 乐观常见的两种实现方式 乐观一般会使用版本号机制或CAS算法实现。 1. 如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本

37230

javacas(java实现原理)

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

11120
  • 广告
    关闭

    新年·上云精选

    热卖云产品年终特惠,2核2G轻量应用服务器7.33元/月起,更多上云必备产品助力您轻松上云

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

    java redis_Java中Redis实现

    由于具体业务场景的需求,需要保证数据在分布式环境下的正确更新,所以研究了一下Java中分布式实现Java分布式实现方式主要有以下三种: 数据库实现的乐观 Redis实现的分布式 Zookeeper实现的分布式 其中,较常用的是前两种方式,但是数据库实现方式需要较多的数据库操作,所以最终选择的是用 Redis实现分布式。 第一,Redis需要有一个超时时间,这样即便某个持有的节点挂了,也不到导致其他节点死锁,保证每个有一个UniqueId;第二,每个需要有一个UniqueId,确保当一个线程执行完一个任务去释放的时候释放的一定是自己的 而当这个key在redis中已有记录时,则不会重新插入记录,这样的话,便可以实现分布式的基本功能。且为其设置过期时间,并加入UniqueId的check,避免了上述提及的两个问题。

    60920

    java读写实现原理_java可重入原理

    两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取以及释放都是Java虚拟机帮助用户完成的; ReentrantLock是类层面的实现,因此的获取以及的释放都需要用户自己去操作。 synchronized一整个Hash表,而ConcurrentHashMap则利用ReentrantLock实现分离,的知识segment而不是整个Hash表 3、synchronized 是不公平,而ReentrantLock可以指定是公平的还是非公平的 4、synchronized实现等待/通知机制通知的线程是随机的,ReentrantLock实现等待/通知机制可以有选择性地通知 它和后者都是单独的实现,彼此之间没有继承或实现的关系。

    9210

    Java时间操作代码实现

    OK,本文的主题是java中常用的时间操作,在平时开发过程中经常会使用到这些时间操作类,但是大部分使用都是其他工具包提供的类或者就那么几个常用的方法,对其中的方法也都并没有深入学习。 相信对于java开发者Date类是经常使用的,我们可以通过它来获取时间信息,也可以对时间进行格式化输出(此类方法已经过时),接下来看一下具体使用。 java.text包是一个实现国际化程序的开发包,SimpleDateFormat类是一个专门处理时间格式的类。 首先我们看一下它的继承关系 java.lang.Object java.text.Format java.text.DateFormat java.text.SimpleDateFormat 只是因为Calendar累的概念复杂,牵扯到时区与本地化等等,Jdk的实现中使用了成员变量来传递参数,这就造成在多线程的时候会出现错误。

    36830

    Java 中的悲观和乐观实现

    一、定义 1.悲观:即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录掉,这样别人就没法改这条数据了,一直到你的释放。 二、实现过程 2.悲观:悲观实现采用的数据库内部的机制,一个典型的倚赖数据库的悲观调用: select * from account where name=”张三” for update 所以我们这个时候可以使用乐观。 1.乐观:乐观实现可以通过在表里面加一个版本号的形式,下面是一个实例。 ? 三、另一种的乐观实现方法叫做CAS,具体请参照:https://www.cnblogs.com/qjjazry/p/6581568.html 原理其实和上面说的是一样的,也是通过类似版本号这种模式来进行判断的 ,不过CAS是在内存中实现这个版本号判断的。

    90810

    Java里有哪些?Synchronized如何实现同步

    互斥锁在Java中的具体实现就是ReentrantLock读写锁在Java中的具体实现就是ReadWriteLock 5,乐观/悲观 乐观认为对于同一个数据的并发操作,是不会发生修改的。 乐观锁在Java中的使用,是无编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 二,Synchronized如何实现同步Java中每一个对象都可以作为,这是synchronized实现同步的基础。 Java中同步代码块是使用monitorenter和monitorexit指令实现,同步方法依靠的是方法修饰符上的ACCSYNCHRONIZED实现。 Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、状态标志、线程持有的、偏向线程 ID、偏向时间戳等等。

    2.8K21

    哈希时间(HTLC)

    概述 哈希时间(Hashed TimeLock Contract HTLC)是指可以创建特定智能合约的功能,该合约可以修改付款通道。 技术来说 HTLC功能实现了两个用户之间的限时交易。 实践中 HTLC交易的接收方必须在`指定的时间范围内(指定区块数)提交一个加密证明,来确认这笔支付。如果接收方在指定时间没有确认活确认失败,则这笔支付资金将返还给原有的发送者。 哈希原像是用来生成哈希、并随后解锁资金的信息。 TimeLock(时间):限制资金直到未来的指定时间才能进行支出的功能;在bitcoin中有实现,例如:CheckLockTimeVerify或者CheckSequenceVerify. Bitcoin的闪电网络是Hashed TimeLocked合约最受欢迎的用例之一;通过在支付通道中实现HTLC,资金通过支付通道可以在不同的用户之间进行转移,而不需要依赖任何第三方的信任。

    9410

    java编程_使用CAS、FAA实现编程

    会导致性能降低,在特定情况可用硬件同步原语替代,保证和一样数据安全,同时提供更好性能。 所以在某些情况下,原语可以用来替代实现一些即安全又高效的并发操作。 CAS和FAA在各种编程语言中,都有相应的实现,可直接使用,各种语言底层实现一样的。 实现: package main import ( “fmt” “sync” ) func main() { // 账户初始值为0元 var balance int32 balance = int32 也可在每次循环结束后,Sleep()小段时间,但这样性能会严重下降。 所以,这种方法它只适于线程碰撞不太频繁,即执行CAS不需要重试这样的场景。 用、CAS和FAA完整实现账户服务 https://github.com/shenyachen/JKSJ/blob/master/study/src/main/java/com/jksj/study/

    10820

    JAVA的Lock接口实现

    Lock类里面有个trylock() ,就是试一下,如果拿到拿不到,就立刻返回,还可以设置等待时间,lock.tryLock(10000L, TimeUnit.MILLISECONDS)。 (二) 读写实现 ① 介绍 维护一对关联锁,一个用于只读操作,一个用于写入,读可以由多个读线程同时持有,写是排他的。适合读取线程比写入线程多的场景,改进互斥的性能。 AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同步组件的内部类 子类在实现中,可以实现其一部分方法。 其编程思想值得借鉴,通过超类实现基本的处理流程,将其中部分抽成未实现方法,默认抛出异常,由子类实现,这种解耦方式,最大化的减少了代码的重复,且便于子类在实现中个性化自己的处理逻辑。

    79620

    时间java实现「建议收藏」

    时间java实现 一、java调度方法: 前言 在开发高性能服务器中,定时器总是不可或缺的。 常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,如果程序中的定时器数量比较少,基于最小堆的定时器一般可以满足需求,且实现简单。 任务二在2000ms执行,4000ms后结束,任务二不会等任务一执行完成后执行,抛出异常也会执行任务二 java调度算法时间复杂度 实现方式 加入任务 取消任务 运行任务 基于排序链表 O(n) O( 1) O(1) 基于最小堆 O(lgn) O(1) O(1) 二、时间轮调度算法: 比java调度算法更高效的算法,时间复杂度为O(1) 1、如果执行任务抛出异常,会执行后面的任务的 2、1s执行任务一 ,2s执行任务二 3、1s执行多个任务 算法对比 实现方式 加入任务 取消任务 运行任务 基于排序链表 O(n) O(1) O(1) 基于最小堆 O(lgn) O(1) O(1) 基于时间轮 O(1

    8020

    Java

    java中的乐观基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 java中的 1.自旋 自旋原理非常简单,如果持有的线程能在很短时间内释放资源,那么那些等待竞争的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有的线程释放后即可立即获取 如果持有的线程执行的时间超过自旋等待的最大时间扔没有释放,就会导致其它争用的线程在最大等待时间内还是获取不到,这时争用线程会停止自旋进入阻塞状态。 Synchronized的实现 ? 偏向 Java偏向(Biased Locking)是Java6引入的一项多线程优化。 上面几种都是JVM自己内部实现,当我们执行synchronized同步块的时候jvm会根据启用的和当前线程的争用情况,决定如何执行同步操作; 在所有的都启用的情况下线程进入临界区时会先去获取偏向

    53500

    队列实现原理_优先队列 java

    首次接触无数据结构的设计,请各位大佬多多指教~~~ CAS(Compare && Swap)原子操作 CAS是无(lock free)的数据结构的基础。 false; } CAS相似的原子操作: fetch and add,一般用来对变量做+1的原子操作 test and set, 写值到内存位置并传回其旧值 test test and set : 和双检查一样为了减少对的多次竞争 ,对的竞争代价比普通判断的状态要大,这里需要着重强调,在high level programming的背景下,尽量少用双重检测的形式,因为第二次检查和设置并不一定是原子操作。 class T > bool atomic_compare_exchange_weak( volatile std::atomic* obj, T* expected, T desired ); 无队列的链表实现 用数组实现队列 无队列可以用ring buffer实现,定位head和tail可以声明两个计数器,一个用来计数EnQueue的次数,一个用来计数DeQueue的次数,当队列满或空,可以抛出异常,没有内存泄露的问题

    9930

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 云原生数据库 TDSQL-C

      云原生数据库 TDSQL-C

      云原生数据库 TDSQL-C(Cloud Native Database TDSQL-C)。TDSQL-C 是数据库产品中心自研的新一代高性能高可用的云原生数据库。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券