线程锁有几种实现方式(java多线程‘锁’,是用什么锁的,有方法)
本文目录
java多线程‘锁’,是用什么锁的,有方法
多线程的同步锁通过synchronized实现有俩种方式 一种是在代码块加锁代码块加锁时可以指定任意类的实例过的对象即锁在这个对象上(任何对象都有一个锁)使同一时间内只有一个线程可以访问到代码块中另外一种就是以synchronized关键字修饰方法这时加锁的对象就是类本身的实例 即this以上 O(∩_∩)O
分布式锁的三种实现方式
分布式锁的三种实现方式分别是:基于数据库实现分布式锁、基于缓存(Redis等)实现分布式锁、基于Zookeeper实现分布式锁。
一、基于数据库实现分布式锁
1、悲观锁
利用select … where … for update 排他锁。
注意:其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。
2、乐观锁
所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到,抢购和秒杀就是用了这种实现以防止超卖,通过增加递增的版本号字段实现乐观锁。
二、基于缓存(Redis等)实现分布式锁
1、使用命令介绍:
(1)SETNX
SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
(2)expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
(3)delete
delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。
2、实现思想:
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
三、基于Zookeeper实现分布式锁
ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。
基于ZooKeeper实现分布式锁的步骤如下:
(1)创建一个目录mylock。
(2)线程A想获取锁就在mylock目录下创建临时顺序节点。
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁。
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点。
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。
扩展资料;
一、数据库分布式锁实现的缺点:
1、db操作性能较差,并且有锁表的风险。
2、非阻塞操作失败后,需要轮询,占用cpu资源。
3、长时间不commit或者长时间轮询,可能会占用较多连接资源。
二、Redis(缓存)分布式锁实现的缺点:
1、锁删除失败,过期时间不好控制。
2、非阻塞,操作失败后,需要轮询,占用cpu资源。
三、ZK分布式锁实现的缺点:
性能不如redis实现,主要原因是写操作(获取锁释放锁)都需要在Leader上执行,然后同步到follower。
线程的几种控制方式以及线程间的几种通信方式
几种进程间的通信方式(1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。(2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。(3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。(4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。(5)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。(6)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。(7)套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。几种线程间的通信机制1、锁机制1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。2、信号量机制:包括无名线程信号量与有名线程信号量3、信号机制:类似于进程间的信号处理。线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。
java线程锁有几种
1、自旋锁2、自旋锁的其他种类3、阻塞锁4、可重入锁5、读写锁6、互斥锁7、悲观锁8、乐观锁9、公平锁10、非公平锁11、偏向锁12、对象锁13、线程锁14、锁粗化15、轻量级锁16、锁消除17、锁膨胀18、信号量
IOS中实现线程加锁的几个方法
iOS 线程加锁的方式具体有如下几种:
NSLock实现的锁。
NSLock是Cocoa提供给我们最基本的锁对象,这也是我们经常所使用的,除lock和unlock方法外,NSLock还提供了tryLock和lockBeforeDate:两个方法,前一个方法会尝试加锁,如果锁不可用(已经被锁住),刚并不会阻塞线程,并返回NO。lockBeforeDate:方法会在所指定Date之前尝试加锁,如果在指定时间之前都不能加锁,则返回NO。
使用synchronized关键字构建的锁
@synchronized指令使用的obj为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2中的@synchronized(obj)改为@synchronized(other),刚线程2就不会被阻塞,@synchronized指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制,但作为一种预防措施,@synchronized块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁。所以如果不想让隐式的异常处理例程带来额外的开销,你可以考虑使用锁对象。
使用C语言的pthread_mutex_t实现的锁
//主线程中TestObj *obj = ; pthread_mutex_unlock(&mutex);});
使用GCD来实现的”锁”
//主线程中TestObj *obj = ; dispatch_semaphore_signal(semaphore);});
更多文章:

pcan explore 导入dbc,很多信息丢失?什么是Symantec pcAnywhere
2025年3月21日 15:40

什么软件可以用做随机抽奖工具?用excel表 怎么设置一个随机抽奖
2025年2月19日 02:10

无法加载购物车数据(为什么淘宝网一点开购物车就是无法显示网页)
2025年3月11日 09:40

compensate翻译(英语vistors will be compensated怎么翻译)
2025年2月10日 15:40

antenna公司(“国民MC”刘在石签约柳熙烈公司,他们两人将会擦出怎样的火花)
2025年2月9日 23:10

fedora14(fedora14 可以在终端输入命令,但是鼠标点什么都没用)
2025年3月19日 11:00