-
synchronized(同步锁)
(1)使用Object的wait()和notify()方法可以控制锁的等待与唤醒 -
ReentrantLock(重入锁)
(1)tryLock()方法可以防止死锁
(2)lockInterruptibly()响应中断
(3)Condition的await()和signal()方法类似Object的wait()和notify()方法 -
Semaphore(信号量)
(1)允许多个线程同时访问(多个许可)
(2)使用acquire()和release()获取或释放一个许可 -
ReadWriteLock(读写锁)
(1)使用方法ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Lock readLock = readWriteLock.readLock(); Lock writeLock = readWriteLock.writeLock(); //然后给读取操作加读锁,给写操作加写锁
(2)约束情况,只有读读是非阻塞的,读写、写读、写写都是阻塞的
读 写 非阻塞 阻塞 阻塞 阻塞 -
mysql lock
获取锁:select get_lock(‘key’, 100) from dual;
释放锁:select release_lock(‘key’) from dual;
这种锁的优点是,如果我们只有一个数据库,可以使用这种方式给分布式应用加锁,而且这个锁如果客户端断线了会自动释放,不会导致无限等待。可以参考博主另一篇文章http://blog.youkuaiyun.com/tangtong1/article/details/51792617
欢迎关注我的公众号“彤哥读源码”,查看更多“源码&架构&算法”系列文章, 与彤哥一起畅游源码的海洋。