您现在的位置是:主页 > Web前端技术 > Web前端技术

Java8容易遗忘的八个功能是什么编程语言

IDCBT2022-01-07服务器技术人已围观

简介本篇内容介绍了“Java8容易遗忘的八个功能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大

本篇内容介绍了“Java8容易遗忘的八个功能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java的核心库不断加入各种复杂的用法来减少访问共享资源时的线程等待时间。其中之一就是经典的读写锁(ReadWriteLock),它让你把代码分成两部分:需要互斥的写操作和不需要互斥的读操作。

表面上看起来很不错。问题是读写锁有可能是极慢的(最多10倍),这已经和它的初衷相悖了。Java 8引入了一种新的读写锁——叫做时间戳锁。好消息是这个家伙真的非常快。坏消息是它使用起来更复杂,有更多的状态需要处理。并且它是不可重入的,这意味着一个线程有可能跟自己死锁。

时间戳锁有一种“乐观”模式,在这种模式下每次加锁操作都会返回一个时间戳作为某种权限凭证;每次解锁操作都需要提供它对应的时间戳。如果一个线程在请求一个写操作锁的时候,这个锁碰巧已经被一个读操作持有,那么这个读操作的解锁将会失效(因为时间戳已经失效)。这个时候应用程序需要从头再来,也许要使用悲观模式的锁(时间戳锁也有实现)。你需要自己搞定这一切,并且一个时间戳只能解锁它对应的锁——这一点必须非常小心。

下面我们来看一下这种锁的实例——

long stamp = lock.tryOptimisticRead(); // 非阻塞路径——超级快  work(); // 我们希望不要有写操作在这时发生  if (lock.validate(stamp)){  //成功!没有写操作干扰   }  else {  //肯定同时有另外一个线程获得了写操作锁,改变了时间戳  //懒汉说——我们切换到开销更大的锁吧    stamp = lock.readLock(); //这是传统的读操作锁,会阻塞  try {  //现在不可能有写操作发生了  work();    }  finally {  lock.unlock(stamp); // 使用对应的时间戳解锁  }  }

并发加法器

Java 8另一个出色的功能是并发“加法器”,它对大规模运行的代码尤其有意义。一种最基本的并发模式就是对一个计数器的读写。就其本身而言,现今处理这个问题有很多方法,但是没有一种能比Java 8提供的方法高效或优雅。

到目前为止,这个问题是用原子类(Atomics)来解决的,它直接利用了CPU的“比较并交换”指令(CAS)来测试并设置计数器的值。问题在于当一条CAS指令因为竞争而失败的时候,AtomicInteger类会死等,在无限循环中不断尝试CAS指令,直到成功为止。在发生竞争概率很高的环境中,这种实现被证明是非常慢的。

标签:

很赞哦! ()

相关文章

本栏推荐