lock

基于zookeeper的分布式Lock及RLock的实现

假如想象 提交于 2021-01-03 15:39:43
一.Lock and RLock 需要zookeeper的python 客户端kazoo # -*- coding: utf-8 -*- import os import uuid from kazoo.client import KazooClient from kazoo.recipe.lock import Lock class ZkLock(object): def __init__(self,lockname,zkhosts,basepath='/locks',logger=None,timeout=5): self._zk_hosts = zkhosts # self._client = KazooClient(hosts=self._zk_hosts,logger=logger,timeout=timeout) self._zk_path = os.path.join(basepath,lockname) self._lock_handle = Lock(self._client,self._zk_path) def start(self): self._client.start() def stop(self): self._client.stop() def acquire(self, blocking=True, timeout=None): self

Java跨进程锁定文件

不问归期 提交于 2020-05-07 19:55:39
Java跨进程锁定文件(即OS级别的锁定文件),需要使用排它的锁,需要使用FileOutputStream或者RandomAccessFile(这里指"rw"模式)。 fos=new FileOutputStream(fileFullPath); while(true){ try{ lock=fos.getChannel().lock(); break; }catch(OverlappingFileLockException e1){ Thread.sleep(2000); } } raf=new RandomAccessFile("test.txt",“rw”); while(true){ try{ fileLock=raf.getChannel().lock(); break; }catch(OverlappingFileLockException ofle){ Thread.sleep(1000); } } 再说类FileInputStream和模式为"r"的RandomAccessFile,他们都有channel和FileLock操作,但是经过测试,会报错NonWritableChannelException。例如: fis=new FileInputStream(fileFullPath); while(true){ try{ lock=fis.getChannel()

java Lock interface 与synchronized使用注意--java线程(第三版)

可紊 提交于 2020-03-27 18:23:26
3 月,跳不动了?>>> 在java中,跟着synchronized关键字的lock都会在thread离开同步块的范围时被释放掉,即使是因为异常而离开范围也是一样。所以在java中使用 synchronized关键字时,异常导致不释放锁而导致死锁的现象决不会发生。 Lock interace代替 synchronized关键字,java是不可能会知道此明确lock的范围,如果遇到异常,此lock持有的锁不会自动释放,容易导致死锁现象。有一个简单的方法可以解决这个问题:我们可以用java的finally子句来确保lock会在完成时释放掉,而不管method是怎么离开的。 来源: oschina 链接: https://my.oschina.net/u/2254200/blog/396426

Ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决

一笑奈何 提交于 2020-03-02 16:48:34
ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决 通过终端安装程序sudo apt-get install xxx时出错: E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it 出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现此状况,解决的办法其实很简单,在终端中敲入以下两句: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/loc 来源: oschina 链接: https://my.oschina.net/u/1864705/blog/801388

Lock && Condition_实现有界缓存

五迷三道 提交于 2020-03-02 12:28:55
Lock && Condition_实现有界缓存 ‍ Lock是一种广义的内置锁,Condition也是一种 广义的内置条件队列 。 ‍ 内置条件队列存在一些缺陷。每个内置锁都只能有一个相关的条件队列, 因而多个线程可能在同一个条件队列上等待不同的条件谓词,并且在最常见的加锁模式下公开条件队列对象。 这些因素都使得无法满足在使用notifyAll时所有等待线程为同一类型的需求。 如果想编写一个带有多个条件谓词的并发对象,或者想获得除了条件队列可见性的更多控制权,就可以使用显示的Lock和Condition而不是内置锁和内置条件队列,这是一种更灵活的选择。 ‍ Lock比内置锁提供了更为丰富的功能,Condition同样比内置条件队列提供了更丰富的功能:在每个锁上可能存在多个等待、条件等待可以是可中断的、基于时限的等待,以及公平的或非公平的队列操作。 ‍ 与内置条件队列不同的是,对于每个Lock,可以有任意数量的Condition对象。Condition对象继承了相关的Lock对象的公平性,对于公平的锁,线程会依照FIFO顺序从Condition.await中释放。 下面这段程序给出了有界缓存的另一种实现,即‍ ‍ 使用两个Condition,分别为notFull和notEmpty ‍ ‍,用于表示” 非满 “和” 非空 “两个条件谓词。 当缓存为空时

Java并发编程初级篇(十六):Lock+Condition实现生产者消费者问题

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 10:00:01
之前我们在“ Java并发编程初级篇(十二):使用wait和notify生产者消费者问题 ”,已经使用Java提供的synchronized关键字和wait(),notify(),notifyAll()方法实现过来生产者消费者问题。Java API还为我们提供了锁的解决方案。 使用锁解决阻塞要用到Condition,它是通过Lock.newCondition()来获得的。就像wait()和notify()必须在synchronized块内一样,Condition.await()和Condition.singialAll()方法也必须在Lock.lock()和Lock.unlock()内执行。 代码示例: 首先我们实现一个数据缓冲区,缓冲区中定义了maxSize变量来代表缓冲区大小,LinkedList来模拟缓冲区。然后添加一把锁,并用这把锁来新建两个Condition:producer(控制生产者挂起和唤醒)和consumer(控制消费者挂起和唤醒)。当生产者发现缓冲区满的情况下调用producer.await()挂起,等待消费者消费数据后调用producer.singialAll()方法来唤醒,并重新判断缓冲区状态。当消费者发现缓冲区空的情况下调用consumer.await()挂起,等待生产者向缓冲区中放入数据并调用consumer.singialAll(

lock和wait+signal

送分小仙女□ 提交于 2020-03-02 02:38:00
lock和wait+signal 在编程中,我们经常使用多线程来提升性能,所以这就涉及到 互斥和同步 的问题了。而在编程中,我们一般都是通过如下方式来完成多线程的互斥和同步: lock | unlock signal + wait(timeout) join sleep C语言 在Linux C编程中,我们通常使用 pthread 类库来完成跨平台的多线程控制,如下是几个常用的API: pthread_mutex_lock():占有互斥锁(阻塞操作) pthread_mutex_unlock(): 释放互斥锁 pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程 pthread_cond_wait(): 等待条件变量的特殊条件发生 pthread_cond_timedwait():等待条件变量的特殊条件发生或者timeout pthread_join():阻塞当前的线程,直到另外一个线程运行结束 sleep() : 休眠固定时间, 不过这个API是Linux原生提供,不能跨平台。 注意:**pthread类库是glibc(绝大多数Linux平台标准C库。)的一部分。这些功能都是通过中断号进入内核来完成的,而非仅仅做了Linux兼容API。**具体可见 glibc-2.23\sysdeps\nacl\nacl

锁对象Lock-同步问题更完美的处理方式

可紊 提交于 2019-12-07 11:44:54
Lock 是 java.util.concurrent.locks 包下的接口, Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,当然也能实现 sychronized 一样的效果,代码如下: package org.thread; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Output { private Lock lock = new ReentrantLock(); public void output(String name) { try { lock.lock(); for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } } catch (Exception e) { } finally { lock.unlock(); } } } 现在看看 package org.thread; public class Outputer { public synchronized void input(String name){ for(int i

Thread --- lock/sychronized

眉间皱痕 提交于 2019-12-07 11:44:41
从实现角度来说 : sychronied 关键字是JVM层实现的,由其提供内置的锁。而lock方式必须被显示的创建 从代码角度来说 lock方式,代码缺乏优雅性。sychronized代码更加简洁,代码量少。 从使用角度来说 lock方式更加灵活,但是只有在解决特殊问题的时候才会使用。 用sychronized关键字不能尝试着获取锁且最终获取锁会失败,或者尝试着获取锁一段时间,然后放弃它,要实现这些必须使用lock方式。 使用sychronized关键字时,如果某些事务失败了,那么就会抛出异常,由JVM自动释放线程资源,但是你无法也没有机会去做任何的清理工作,以维护系统使其处于良好的状态。使用显示的Lock方式,你就可以使用finally子句将系统维护在正确的状态了。 显示的Lock对象在加锁和释放锁方面,相对于内建的sychronized锁来说,还赋予了你耕细粒度的控制力。 从性能角度来说 : 在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态 来源: oschina 链接: https://my.oschina.net/u/1018641/blog/539974

java线程调度:Lock ReentrantLock Condition

戏子无情 提交于 2019-12-07 11:30:53
一、我们要打印1到9这9个数字,由A线程先打印1,2,3,然后由B线程打印4,5,6,然后再由A线程打印7,8,9. 这道题有很多种解法,现在我们使用Condition来做这道题(使用Object的wait,notify方法的解法在 这里 )。 原文: http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition 这是一个不错的网站: http://outofmemory.cn/java/ 二、解决AsyncTask能暂停,能取消的问题,重用性很高: https://mobiarch.wordpress.com/2012/07/20/pausing-and-resuming-background-work-in-android/ 三、ReentrantLock可重入锁的使用场景: http://my.oschina.net/noahxiao/blog/101558 来源: oschina 链接: https://my.oschina.net/u/1389206/blog/489731