共享锁

Java读取文件加锁代码Demo(利用Java的NIO)

ぃ、小莉子 提交于 2020-03-15 05:46:54
本博文部分转载于: http://blog.csdn.net/wangbaochu/article/details/48546717 Java 提供了文件锁FileLock类,利用这个类可以控制不同程序(JVM)对同一文件的并发访问,实现进程间文件同步操作。 FileLock是Java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情, 这样的机制保证了众进程可以顺序访问该文件。也可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件, 但也可以通过 FileLock 来进行并发控制,保证进程的顺序执行,避免数据错误。 “Locks are associated with files, not channels. Use locks to coordinate with external processes, not between threads in the same JVM.” 1. 概念 共享锁: 共享读操作,但只能一个写(读可以同时,但写不能)。共享锁防止其他正在运行的程序获得重复的独占锁,但是允许他们获得重复的共享锁。 独占锁: 只有一个读或一个写(读和写都不能同时)

mysql共享锁与排他锁

对着背影说爱祢 提交于 2020-03-14 23:40:26
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行 数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类 型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ..

MySQL常见问题

十年热恋 提交于 2020-03-10 20:20:02
1.UUID – UUID是通用唯一识别码的缩写,其目的是让分布式系统中的所有元素都能有唯一的便是信息,而不需要通过中央控制端来做辨识信息的指定。 – 三部分:时间戳生成的时间信息、主机的硬件时钟序列、主机的唯一机器识别号 SELECT UUID(); – 为了避免每个MySQL各自生成的主键产生重复 – UUID主键好处: – 1.降低了全局节点的压力,是的主键生成速度快 – 2.全局唯一 – 3.跨服务器合并数据很方面 – 缺点 : – 1.占16个字节,比INT(4),BIGINT(8)占空间 – 2.是字符串类型,查询速度慢 – 3.不是顺序增长的字符串,作为主键,数据写入IO随机性很大 – 主键自动增长的优点 – 1.占空间小;2.检索速度快;3.IO写入连续性好 2.在线修改表结构 – ALTER TABLE缺点: – 1.修改表的时候是锁表的,影响写入操作 – 2.如果修改表结构失败,必须还原表结构,耗时更长 – 3.大数据表记录多,修改表结构锁表时间长 – 可以用PerconaTookit工具包 – 链接 ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY

mysql共享锁与排他锁

允我心安 提交于 2020-03-08 08:38:18
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from.

MySQL中InnoDB锁的介绍及用途

巧了我就是萌 提交于 2020-03-01 03:45:53
前言 读这篇文章之前可以先了解一下 MySQL中InnoDB数据结构 一、InnoDB引擎对隔离级别的支持 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 可能 可能 可能 不可重复读(read-committed) 不可能 可能 可能 可重复读(repeatable-read) 不可能 不可能 InnoDB不可能 串行化(serializable) 不可能 不可能 不可能 隔离级别到底如何实现? 二、锁的介绍 1、表锁、行锁 通过锁来管理不同事务对共享资源的并发访问 表锁与行锁的区别: 锁定粒度:表锁 > 行锁 加锁效率:表锁 > 行锁 冲突概率:表锁 > 行锁 并发性能:表锁 < 行锁 InnoDB存储引擎只支持行锁,表锁是通过锁住所有行实现 2、InnoDB锁类型 共享锁(行锁,又称S锁):Shared Locks 又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁, 都能访问到数据,但是只能读不能修改。 select * from teachers WHERE id = 1 LOCK IN SHARE MODE ; commit / rollback 排它锁(行锁,又称X锁):Exclusive Locks 又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他 锁

ZooKeeper的典型应用场景

☆樱花仙子☆ 提交于 2020-02-28 21:12:12
ZooKeeper是一个高可用的分布式数据管理与协调框架 ZAB算法的实现,很好的保证了分布式系统数据一致性 数据发布/订阅 数据发布/订阅系统,即所谓 配置中心 发布者发布数据到ZooKeeper的一系列节点上,供订阅者订阅,达到动态更新数据的目的 实现数据的集中式管理和动态更新 发布/订阅系统一般有 推(Push) 和 拉(Pull) 两种模式 推(Push): 服务端主动将数据推送给客户端 拉(Pull): 客户端主动去服务端拉取最新数据,一般客户端采取定时轮询的策略 ZooKeeper才去的是 推拉结合的策略 客户端向服务端注册需要关注的节点,服务端数据发生变化的时候向客户端 推送watcher事件通知 , 客户端再主动去服务端拉取数据 负载均衡 常见的计算机网络技术,对多台计算机、CPU、磁盘驱动器等分配负载; 达到优化资源使用、最小化响应时间、最大化吞吐率、避免过载的目的 分为软负载和硬负载;ZooKeeper属于软件负载 比较典型的是DNS 服务: DNS是(Domain Name System)域名系统的缩写 可以看做是一个超大规模的分布式映射表(域名-->IP),方便人们通过域名访问互联网站点 实际开发中通常采用本地host 绑定来实现域名解析 基于ZooKeeper实现的动态域名解析方案(DDNS :Dynamic DNS): 域名解析由每个应用自己解决;

多线程进阶——JUC并发编程之CountDownLatch源码一探究竟

ぃ、小莉子 提交于 2020-02-28 11:17:32
1、学习切入点 JDK的并发包中提供了几个非常有用的并发工具类。 CountDownLatch 、 CyclicBarrier 和 Semaphore 工具类提供了一种并发流程控制的手段。本文将介绍CountDownLatch(闭锁)的实现原理。在了解闭锁之前需要先了解AQS,因为CountDownLatch的实现需要依赖于AQS共享锁的实现机制。 官方文档: https://docs.oracle.com/javase/8/docs/api/ 百度翻译如下: 一种同步辅助程序,允许一个或多个线程等待在其它线程中执行的一组操作完成。使用给定的计数初始化CountDownLatch。由于调用了countDown()方法,await方法阻塞直到当前计数为零,之后释放所有等待线程,并立即返回await的任何后续调用。这是一个一次性现象——计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。倒计时锁存器是一种通用的同步工具,可用于多种目的。使用计数1初始化的倒计时锁存器用作简单的开/关锁存器或门:调用倒计时()的线程打开它之前,调用它的所有线程都在门处等待。初始化为N的倒计时锁存器可用于使一个线程等待N个线程完成某个操作或某个操作已完成N次。倒计时锁存器的一个有用特性是,它不要求调用倒计时的线程在继续之前等待计数达到零

mysql共享锁与排他锁

不想你离开。 提交于 2020-02-28 05:48:49
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from.

理解共享锁和排它锁

一曲冷凌霜 提交于 2020-02-27 14:23:31
1.共享锁 (lock in share mode) 1.1 概念 允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁 如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁 1.2 例子: 共享锁事务读取 以不同的 session 来举例: a: start transaction; select * from demo where id = 1 lock in share mode; b: start transaction; select * from demo where id = 1 lock in share mode; 此时 a 和 b 都可以正常获取结果,那么再加入 c 排他锁读取尝试 c: start transaction; select * from demo where id = 1 for update; 在 c 中则无法获取数据,直到超时或其它事物 commit 共享锁事务更新 a: update demo set name = 'xxx' where id = 1; 可以很快获取执行结果。当 b 再次执行修改 id=1 的语句时: b: update demo set name = 'yyy' where id = 1; 就会出现死锁或者锁超时,错误如下: Deadlock found when trying to get lock

Java 独占锁|共享锁|互斥锁

时光怂恿深爱的人放手 提交于 2020-02-23 00:10:24
独占锁 又叫写锁,指该锁只能被一个线程所持有。Java 中 ReentrantLock 和 synchronized 都是独占锁。 共享锁 又叫读锁,指该锁可以被多个线程所持有。Java 中 ReentrantReadWriteLock 其读锁是共享锁,其写锁是独占锁。 读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。 互斥锁 在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。 加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前进程解锁。 加锁前 代码 import java.util.HashMap; import java.util.Map; // 模拟缓存操作 class MyChahe{ private volatile Map<String, Object> map = new HashMap<>(); public void put(String key, Object value) { System.out.println(Thread.currentThread().getName()+"\t 准备写... "+key+" "+value); try { // 停一会 Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } map