从JDK源码角度看线程的阻塞和唤醒

目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合、wait与notify组合、park与unpark组合。其中suspend与resume因为存在无法解决的竟态问题而被Java废弃,同样,wait与notify也存在竟态条件,wait必须在notify之前执行,假如一个线程先执行notify再执行wait将可能导致一个线程永远阻塞,如此一来,必须要提出另外一种...
阅读(4912) 评论(0)

从JDK源码角度看并发锁的优化

在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能。比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。如图,...
阅读(4718) 评论(0)

从JDK源码角度看并发竞争的超时

JDK中的并发框架提供的另外一个优秀机制是锁获取超时的支持,当大量线程对某一锁竞争时可能导致某些线程在很长一段时间都获取不了锁,在某些场景下可能希望如果线程在一段时间内不能成功获取锁就取消对该锁的等待以提高性能,这时就需要用到超时机制。在JDK1.5之前并没有对此支持,当时的并发控制职能通过JVM内置的synchronized关键词实现锁,但对一些特殊要求却力不从心,例如超时取消控制。JDK1.5...
阅读(5088) 评论(0)

从JDK源码角度看线程池原理

“池”技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实现类由不同厂商实现,数据库连接的建立和销毁都是很耗时耗资源的操作,为了查询数据库中某条记录,最原始的一个过程是建立连接、发送查询语句、返回查询结果、销毁连接,假如仅仅是一个很简单的查询语句,那么可能建立连接与销毁连接两个...
阅读(5354) 评论(0)

从JDK源码角度看java并发线程的中断

线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止。在java中要让线程安全、快速、可靠地停下来并不是一件容易的事,java也没有提供任何可靠的方法终止线程的执行。        线程调度策略中有抢占式和协作式两个概念,与之类似的是中断机制也有协作式和抢占式。        历史上Jav...
阅读(5597) 评论(0)

从JDK源码角度看java并发的公平性

JAVA为简化开发者开发提供了很多并发的工具,包括各种同步器,有了JDK我们只要学会简单使用类API即可。但这并不意味着不需要探索其具体的实现机制,本文从JDK源码角度简单讲讲并发时线程竞争的公平性。        所谓公平性指所有线程对临界资源申请访问权限的成功率都一样,不会让某些线程拥有优先权。我们知道CLH Node FIFO等待队列是一个先进先出的队列,那么是否就可以说每条线程获取锁时就是...
阅读(3313) 评论(0)

从JDK源码角度看java并发的原子性如何保证

JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面,肯定要通过用C++编写的native本地方法来扩展实现。JDK提供了一个类来满足CAS的要求,sun.misc.Unsafe,从名字上可以大概知道它用于执行低级别、不安全的操作,AQS就是使用此类完...
阅读(3662) 评论(0)

[置顶] 如何设计一个数据库中间件(支持百亿级别数据存储)

继《如何设计开发一个可用的web容器》之后又一如何系列文章,《如何设计一个数据库中间件》...
阅读(10331) 评论(5)

[置顶] web安全认证机制知多少

如今web服务随处可见,成千上万的web程序被部署到公网上供用户访问,有些系统只针对指定用户开放,属于安全级别较高的web应用,他们需要有一种认证机制以保护系统资源的安全,本文将探讨五种常用的认证机制及优缺点。Basic模式HTTP协议规范中有两种认证方式,一种是Basic认证,另外一种是Digest认证,这两种方式都属于无状态认证方式,所谓无状态即服务端都不会在会话中记录相关信息,客户端每次访问...
阅读(12767) 评论(0)

git常用技巧

一般的过程:①如果还没有库先用 git clone 克隆一个库。②使用 git checkout master切换到master分支。③使用 git pull 同步远程master分支(即git fetch + git merge,可用git pull -rebase避免merge垃圾提交信息)。④使用 git checkout -b myBranch 基于master分支创建一个新分支myBra...
阅读(3291) 评论(0)
    打赏作者

    赞作者(*^__^*)



    如果您觉得作者写的文章有帮助到您,您可以打赏作者一瓶汽水(*^__^*)

    作者

    笔名:seaboat 汪洋之舟

    github:https://github.com/sea-boat

    微信:



    公众号:

    个人资料
    • 访问:866604次
    • 积分:12009
    • 等级:
    • 排名:第1314名
    • 原创:284篇
    • 转载:5篇
    • 译文:1篇
    • 评论:316条
    博客专栏