
锁
自由圣骑士
喜欢学习、喜欢接近新事物。
展开
-
偏向锁、轻量级锁、自旋锁、Synchronized同步锁(重量级锁)
Synchronizedsynchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。Synchronized的使用synchronized的3种使用方式修饰实例方法:作用于当前实例加锁修饰静态方法:作用于当前类对象加锁修饰代码块:指定加锁对象,对给定对象加锁synchronized的代码范例Synchronized的底层实现...原创 2019-08-03 10:22:15 · 445 阅读 · 0 评论 -
为什么ConcurrentHashMap的get操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的这也是这篇博文讨论的问题——为什么它不需要加锁呢?1、ConcurrentHashMap的简介有基础的同学知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的1.8中放弃了Segmen...原创 2019-09-07 11:50:38 · 6778 阅读 · 3 评论 -
如何解决重复提交
1、幂等的概念幂等F(F(x)) = F(x)多次运算结果一致。在编程中常见幂等:1、select查询天然幂等2、delete删除也是幂等,删除同一个多次效果一样3、update直接更新某个值的,幂等4、update更新累加操作的,非幂等5、insert非幂等操作,每次新增一条2、产生原因由于重复点击或者网络重发:1、点击提交按钮两次;2、点击刷新按钮;3、使用浏览器的后退...原创 2019-08-28 11:24:16 · 341 阅读 · 0 评论 -
三种方式实现分布式锁的性能比较
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们,任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一...原创 2019-08-15 14:40:09 · 1167 阅读 · 0 评论 -
使用一个实际生活场景的故事说一下java并发
实际故事内容故事可能比较奇怪。有这么一个学校,里面有好多好多人,我们简单分成学生、老师、以及宿管阿姨。学校中间还有一个很奇葩的水果超市,里面有个仓库放着苹果、西瓜、橘子。来这个超市的人,一方面可以拿走水果吃掉,另一方面也可以送来水果还钱。不过超市还有一个很奇葩的规则,就是学生只能去吃或者送苹果,老师则只能西瓜,宿管阿姨只能橘子。这个超市的进出也很有规矩,来这个超市的人,必须持有相应的证件,...原创 2019-08-19 09:39:07 · 793 阅读 · 1 评论 -
java并发工具类、并发容器、并发队列
并发工具类提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。CountDownLatch功能CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。原理CountDownLatch是通过一个计数器来实现的,计数器的初始...原创 2019-08-06 17:27:13 · 300 阅读 · 0 评论 -
redis单线程的原因和并发快的原因
Redis的高并发和快速原因1、redis是基于内存的,内存的读写速度非常快;2、redis是单线程的,省去了很多上下文切换线程的时间;3、redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。为什么redis...原创 2019-08-08 16:27:58 · 366 阅读 · 0 评论 -
基于redis的分布式锁实现
在单实例JVM中,常见的处理并发问题的方法有很多,比如synchronized关键字进行访问控制、volatile关键字、ReentrantLock等常用方法。但是在分布式环境中,上述方法却不能在跨JVM场景中用于处理并发问题,当业务场景需要对分布式环境中的并发问题进行处理时,需要使用分布式锁来实现。分布式锁,是指在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问。目前比较...原创 2019-08-01 18:38:04 · 234 阅读 · 0 评论 -
CurrentHashMap的实现原理
hash表介绍哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。链式hash表链式哈希表从根本上说是由一组链表...原创 2019-08-05 19:59:43 · 92287 阅读 · 11 评论 -
4种常用Java线程锁的特点,性能比较、使用场景
多线程的缘由在出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求。使用多线程的理由之一是和进程相比,它是一种非常花销小,切换快,更”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而在进程...原创 2019-08-05 15:33:26 · 439 阅读 · 0 评论 -
并发编程相关的问题
并发编程的三要素原子性(atomic)原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行,比如在一个事务里不能一部分操作执行成功,一部分操作执行失败,要么全部执行成功,要么全部执行失败。可见性(volatile)可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。实现可见性的方法:synchro...原创 2019-08-03 16:26:15 · 218 阅读 · 0 评论 -
独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
java相关的锁公平锁/非公平锁可重入锁独享锁/共享锁乐观锁/悲观锁分段锁自旋锁乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用。乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁...转载 2019-08-03 12:26:09 · 158 阅读 · 0 评论 -
Synchronized 底层原理
一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:(1)修饰普通方法(2)修饰静态方法(3)修饰代码块接下来我就通过几个例子程序来说...原创 2019-09-23 16:13:20 · 141 阅读 · 0 评论