重入锁与同步关键字sychronized
来源:互联网 发布:ipad看文献 知乎 编辑:程序博客网 时间:2024/06/05 02:42
重入锁采用ReentrantLock 实现,和同步关键字sychronized都可以用来在多线程环境下保护临界区资源,确保安全性。重入锁相比sychronized有着显示的操作过程,需要手动控制何时加锁和解锁(如不解锁则会造成死锁),之所以称为重入锁,是因为锁是可以反复进入的,即同一个线程可以连续多次获得锁而不会造成死锁,相应的解锁也需要多次,否则会造成其它线程因为获取不到锁而无法访问临界区资源。
重入锁可以替换sychronized,instance是类的实例,请自行添加ReenterLock instance = new ReenterLock();例如:
public class ReenterLock implements Runnable{ private static ReentrantLock lock = new ReentrantLock(); private static int i = 0; @Override public void run() { for (int j = 0; j < 100000; j++) { //加锁保证对变量i的安全访问 lock.lock(); try { i++; } finally { lock.unlock(); } } } public static void main(String[] args) throws InterruptedException{//注意两个线程要指向的是同一实例(关注的是同一个对象锁) Thread t1 = new Thread(instance); Thread t2 = new Thread(instance); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(i); }}用同步关键字也是保证对变量 i 访问的安全性的,例如:
public class ReenterLock implements Runnable{ private static ReenterLock instance = new ReenterLock(); private static int i = 0; public static synchronized void increase() { i++; } //两种同步方式都可行,任选一种 @Override public void run() { for (int j = 0; j < 100000; j++) { synchronized (instance) { i++; } } } /*@Override public void run() { for (int j = 0; j < 100000; j++) { increase(); } }*/ public static void main(String[] args) throws InterruptedException{ Thread t1 = new Thread(instance); Thread t2 = new Thread(instance); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(i); }}使用重入锁和同步关键字输出结果均是一致的。
关于重入锁的高级应用,如中断响应、限时等待锁、condition条件,有兴趣的可以自行了解。推荐书籍:实战java高并发程序设计
阅读全文
0 0
- 重入锁与同步关键字sychronized
- sychronized同步理解
- 关于java中的 sychronized 同步方法 与 同步块的理解
- 关于java中的 sychronized 同步方法 与 同步块的理解 .
- 关于java中的 sychronized 同步方法 与 同步块的理解
- 关于java中的 sychronized 同步方法 与 同步块的理解
- Java 中的Sychronized关键字 和线程
- Java同步机制:sychronized对代码影响
- 如何用sychronized来让线程同步
- Java同步机制:sychronized对代码影响
- java多线程之volatile与sychronized
- 线程同步的方法:sychronized、lock、reentrantLock等总结分析
- sychronized 同步的等待和唤醒锁的状态
- 线程同步与"Lock"关键字
- Java多线程:线程同步与关键字synchronized
- volatile关键字与Java同步内存模型
- Java线程 锁对象Lock-同步问题比sychronized更完美的处理方式
- java sychronized
- Docker如何从第三方拉取镜像
- 企业选择dedecms模板建站怎么样?
- IDEA 十大快捷键
- 修改jar包源码,成功编译,应用到项目中
- Eclipse 如何安装和使用 MAT 插件(内存映像分析工具 Eclipse Memory Analyzer)
- 重入锁与同步关键字sychronized
- 冒泡排序算法
- Qt5中 char* 和 QString 的互转问题
- Java 原码、反码、补码详解
- 下载安装adb(菜鸟)并安装.apk:出现错误 List of devices attached,*damon not running,starting it now on port 5037*...
- MongoDB
- 微信小程序项目实例
- Dedecms模板下载:织梦办公桌椅家具类企业源码
- 【easyUI】分页和组合框问题