Java锁机制-重入锁
2024-10-20 05:35:20
锁的种类:
读写锁 悲观锁 乐观锁 CSA无锁 自旋锁 AQS 非公平锁 公平锁 互斥锁 排它锁 分布式锁(redis实现 和 zk实现)
轻量级锁(lock),重量级锁(synchronize)
重入锁
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。
重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
锁的特征是可以传递的,锁是可以传递的,是方法递归进行传递 。是为了避免死锁问题的
在JAVA环境下 ReentrantLock(显式锁、轻量级锁)和Synchronized (内置锁、重量级锁)都是 可重入锁
废话不多说,ReentrantLock(显式锁、轻量级锁):
package SuoTest; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class ChongruTest extends Thread { Lock lock =new ReentrantLock(); @Override
public void run() {
set(); } public void set(){
try {
lock.lock();
System.out.println("set方法");
get();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
} }
public void get(){
System.out.println("lock 可以具备可重入性-get方法");
try {
lock.lock();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
}
} public static void main(String[] args) {
ChongruTest chongruTest = new ChongruTest();
chongruTest.start();
}
}
运行结果:
Synchronized (内置锁、重量级锁):
正常情况下释放锁的条件是 异常或者代码运行完毕
package SuoTest; public class SynchronizeTest implements Runnable{
public void run() {
set();
}
public synchronized void set(){
System.out.println("set方法");
get();
}
public synchronized void get(){
System.out.println("get方法");
} public static void main(String[] args) {
SynchronizeTest synchronizeTest = new SynchronizeTest();
Thread t1 = new Thread(synchronizeTest);
t1.start(); } }
set方法把锁传递给了get方法,具备可重入性
最新文章
- 关于javascript中的this关键字
- Winform 导入导出方法
- Roll A Ball
- 试用fastJSON
- Ubuntu 13.10 安装 ia32-lib
- 常见的MIME类型
- TestCase--网站注册模块
- 截取usb数据包,控制usb设备----Relay设备
- Ubuntu下Django初体验(一)——开发环境搭建
- gec210 NAND BOOT与SD BOOT启动原理
- MySQL数据库数据信息迁移
- 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件
- Override与Overload
- BASE64Decoder小解
- DoraBox 漏洞练习平台
- css的定义、用法、注释、命名规则、书写规范
- gcc5.2版本安装详解
- 2 duplicate symbols for architecture“文件冲突”
- IIS - 虚拟目录与应用程序的异同
- JS和DOM的关系
热门文章
- mac 下删除xcode后使用git
- 从jar中读取资源文件的问题
- 使用Crashlytics来保存应用崩溃信息
- 【mac IntelliJ Idea】mac上 idea快速重写父类方法 快捷键
- Python3.2官方文档翻译--作用域和命名空间实例
- Eclipse出现&;quot;Running Android Lint has encountered a problem&;quot;解决方式
- mysql 授权新的root用户
- 【Python】输出程序运行的百分比
- Laravel 设置语言不生效的问题
- java new一个接口到底要做什么