在目前开发的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 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。...6.讲解的单例模式虽然很简单, 但如果遇到多线程将会变得非常麻烦, 如何在多线程中解决这么棘手的问题呢?本章将全面介绍解决方案。
通过这些高难度问题,您将全面掌握Java多线程编程的核心概念、技术和最佳实践。 每个问题都包含了深入的答案解析,涵盖了多线程编程的各个方面。您将了解线程安全、死锁、线程池、线程上下文切换、线程同步和互斥、...
1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)...8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架
java 多线程导入excel数据,预防高并发,线程同步锁,
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中所有的锁
java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...
4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...
文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样的情况,这就是线程...
NULL 博文链接:https://zhaodengfeng1989.iteye.com/blog/2412430
多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁...
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
本文主要介绍 Java 多线程锁的基础知识,这里整理了相关资料及示例代码有兴趣的小伙伴可以参考下
首先希望大家喜欢我制作的文档,如果文档中有什么误解的地方,望告诉一下,5分是也不多,是系统默认的,那么就5分咯,java多线程详解,线程池原理,8种锁,java内存模型......