锁的种类:

读写锁   悲观锁  乐观锁 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方法,具备可重入性

最新文章

  1. 关于javascript中的this关键字
  2. Winform 导入导出方法
  3. Roll A Ball
  4. 试用fastJSON
  5. Ubuntu 13.10 安装 ia32-lib
  6. 常见的MIME类型
  7. TestCase--网站注册模块
  8. 截取usb数据包,控制usb设备----Relay设备
  9. Ubuntu下Django初体验(一)——开发环境搭建
  10. gec210 NAND BOOT与SD BOOT启动原理
  11. MySQL数据库数据信息迁移
  12. 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件
  13. Override与Overload
  14. BASE64Decoder小解
  15. DoraBox 漏洞练习平台
  16. css的定义、用法、注释、命名规则、书写规范
  17. gcc5.2版本安装详解
  18. 2 duplicate symbols for architecture“文件冲突”
  19. IIS - 虚拟目录与应用程序的异同
  20. JS和DOM的关系

热门文章

  1. mac 下删除xcode后使用git
  2. 从jar中读取资源文件的问题
  3. 使用Crashlytics来保存应用崩溃信息
  4. 【mac IntelliJ Idea】mac上 idea快速重写父类方法 快捷键
  5. Python3.2官方文档翻译--作用域和命名空间实例
  6. Eclipse出现"Running Android Lint has encountered a problem"解决方式
  7. mysql 授权新的root用户
  8. 【Python】输出程序运行的百分比
  9. Laravel 设置语言不生效的问题
  10. java new一个接口到底要做什么