`
guozhenqian
  • 浏览: 149568 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java多线程中锁的问题

    博客分类:
  • Java
阅读更多

 

   在目前开发的java多线程程序中用的最多的锁就是Synchronized和ReentrantLock,相信大多是童鞋都用过Synchronized但是对ReentrantLock可能了解的不多,下面就详细的对比分析一下两种锁的不同之处和用法

先说Synchronized,这种锁用起来比较简单,这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。 但是容易造成线程的阻塞,导致线程池中最后无线程可用。下面举一个简单的例子

synchronized(syncObject) {  

   //允许访问控制的代码 

   通过socket连接另外一台设备(超时时间设为60s 

但是这个线程每20秒钟启动一次,那么就会造成线程的堆积。例如,在设备连接中断的情况下,线程T1启动去连接这个设备,那么在超时之前T1是不会释放这个锁的,在20s的时候线程T2启动,然后T2被阻塞,等待T1在60s超时时释放锁,这样循环下去,导致启动的线程越来越多,最后导致系统线程池中的资源耗尽。

ReentrantLock可以很好的解决这个问题

 private Lock lock;
 lock = new ReentrantLock(false);

if (lock.tryLock()) {

//若获取锁成功,读取当前sc的数据

try {

//允许访问控制的代码 

通过socket连接另外一台设备(超时时间设为60s 

}

}catch(DeviceException de) {

de.printStackTrace();

}finally {

lock.unlock();

}

}

 else { 

//若获取锁失败,直接放弃本次尝试,接着循环读取列表中下一个sc的数据

//do nothing here, equals to continue loop

}

上面这段代码就很容易的解决了堆积这个问题,例如当线程T1在获得锁之后,线程T2试图去获得锁,如果成功T2就执行try中的代码,如果不成功,T2就放弃获得锁,这样就不会存在线程堆积了。不过记得使用ReentrantLock的话一定记得使用lock.unlock();方法解锁,因为ReentrantLock不会像Synchronized一样自动解锁

分享到:
评论

相关推荐

    java多线程之并发锁

    此文档能够让读者彻底了解JAVA开发中的多线程并发锁的使用

    java多线程核心技术

    结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如服务器、数据库、应用。多线程可以有效提升计算和处理效率,大大提升吞吐量和可伸缩性,...

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java多线程编程_java多线程_

    1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。...6.讲解的单例模式虽然很简单, 但如果遇到多线程将会变得非常麻烦, 如何在多线程中解决这么棘手的问题呢?本章将全面介绍解决方案。

    Java 多线程编程面试集锦20道问题解答Java多线程编程高难度面试题及解析

    通过这些高难度问题,您将全面掌握Java多线程编程的核心概念、技术和最佳实践。 每个问题都包含了深入的答案解析,涵盖了多线程编程的各个方面。您将了解线程安全、死锁、线程池、线程上下文切换、线程同步和互斥、...

    多线程系列相关的技术要点

    1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)...8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架

    多线程导入excel 数据

    java 多线程导入excel数据,预防高并发,线程同步锁,

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    Java 多线程与并发(3-26)-Java 并发 - Java中所有的锁.pdf

    Java 多线程与并发(3_26)-Java 并发 - Java中所有的锁

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

    Java多线程安全问题和锁

    文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样的情况,这就是线程...

    Java多线程高并发篇(一)--重入锁

    NULL 博文链接:https://zhaodengfeng1989.iteye.com/blog/2412430

    java模拟多线程买票问题.docx

    多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁...

    Java学习源码Java多线程的代码

    在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    java 多线程-锁详解及示例代码

    本文主要介绍 Java 多线程锁的基础知识,这里整理了相关资料及示例代码有兴趣的小伙伴可以参考下

    java多线程详解,线程池原理,8种锁,java内存模型......

    首先希望大家喜欢我制作的文档,如果文档中有什么误解的地方,望告诉一下,5分是也不多,是系统默认的,那么就5分咯,java多线程详解,线程池原理,8种锁,java内存模型......

Global site tag (gtag.js) - Google Analytics