把ResultSet对象转变成List对象
ReentrantLock实现了Lock接口。ReentrantLock是可重入锁,支持同一个线程对资源的重复加锁。
简单用法示例:
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
System.out.println("执行业务操作");
} finally {
lock.unlock();
}
}
ReentrantLock有3个静态内部类:Sync、NonfairSync、FairSync,其中Sync是AQS的子类,是抽象类,有一个抽象的void lock()方法。NonfairSync和FairSync都是Sync的子类,前者是非公平实现,后者是公平实现,这两个类均重写了Sync的lock()方法和AQS的tryAcquire(int acquires)方法。
ReentrantLock的lock()方法内部就是调用Sync实例的lock()方法:
假如是默认的非公平实现的话,则会调用NonfairSync的lock()方法,内部实现是先CAS设置state,由0设置成1,如果设置成功,则把当前线程设置为获取独占锁的线程,如果设置失败,则调用acquire(1)。acquire方法是AQS的方法,内部会先调用tryAcquire()方法,tryAcquire也是AQS的方法,但是AQS没有实现,需要具体实现类实现,这里由NonfairSync具体实现。如果tryAcquire方法返回true,则表示线程获取到锁,lock方法返回。如果tryAcquire方法返回false,则会调用addWaiter()方法把当前线程加到同步队列尾部,然后调用acquireQueued()方法,acquireQueued方法内部有个死循环,直到当前线程获取到锁才会跳出循环返回。NonfairSync的tryAcquire方法内部调用Sync的nonfairTryAcquire()方法,实现是先判断当前state的值是否等于0,如果等于0,表示当前锁还没被任何线程获得,则CAS设置state,由0设置成1,如果设置成功,则把当前线程设置为获取独占锁的线程,返回true,否则返回false。如果不等于0,且当前线程就是之前获取到锁的线程,则让state的值加1,返回true。如果当前线程不是之前获取到锁的线程,则返回false。
假如是公平实现的话,则会调用FairSync的lock()方法,lock()方法内部就是调用acquire(1)。还是先调用tryAcquire方法,然后再根据tryAcquire方法的返回值决定是否继续调用addWaiter()方法、acquireQueued()方法。FairSync的tryAcquire方法实现和NonfairSync的tryAcquire方法实现有一点不同,那就是如果state等于0,会先判断在同步队列中当前节点是否有前驱节点,如果有,表示有别的线程比当前线程更早地请求获取锁,为了保证公平性,直接返回false。如果没有,才会去CAS设置state,等等。
tryLock()方法,不管是非公平实现,还是公平实现,逻辑都是一样的。内部就是调用Sync的nonfairTryAcquire()方法,参数是1。先判断当前state值是否等于0,如果等于0,则CAS设置state,由0设置成1,如果设置成功,则把当前线程设为获取独占锁的线程,返回true,否则返回false。如果state值不等于0,则判断获取锁的线程是否是当前线程,如果是,则把state值加1,返回true,否则返回false。
unlock()方法,不管是非公平实现,还是公平实现,逻辑都是一样的。内部就是调用Sync实例的release()方法,参数是1。release()方法是AQS的方法,内部先调用tryRelease()方法,tryRelease()方法也是AQS的方法,但是AQS没有实现,需要具体实现类实现,这里由Sync实现。tryRelease()方法会先判断当前线程是不是获得锁的线程,如果不是的话,会抛IllegalMonitorStateException异常。如果是的话,就把state的值减1,如果state值变为0,则把获取独占锁的线程设置为null,返回true,否则返回false。
ReentrantLock是AQS的独占式实现,Semaphore是AQS的共享式实现。
Semaphore用法示例:
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2); try {
semaphore.acquire();
System.out.println("执行业务操作");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
AQS
AQS,队列同步器,简称同步器,是用来构建锁,如ReentrantLock、ReentrantReadWriteLock,或者其他同步组件,如CountDownLatch、Semaphore的基础框架。它使用一个int类型的成员变量表示同步状态,通过内置的先进先出队列完成线程的排队工作。同步器既支持独占式获取同步状态,也支持共享式获取同步状态,因此可实现不同类型的锁和同步组件。如ReentrantLock是独占式锁,CountDownLatch是共享式锁。
同步器的设计基于模板方法模式。在锁或者同步组件中,创建一个静态内部类,继承同步器并重写它的某些方法来管理同步状态,这些方法如果要修改同步状态,需要调用同步器提供的三个final方法:getState()、setState(int newState)和compareAndSetState(int expect, int update)方法来进行操作,这3个方法能保证状态的改变是安全的。锁或者同步组件对外暴露的获取锁、释放锁的方法会调用同步器的模板方法,这些模板方法又会调用我们重写的方法。可以重写的方法有:
boolean tryAcquire(int arg):独占式获取同步状态。
boolean tryRelease(int arg):独占式释放同步状态。
int tryAcquireShared(int arg):共享式获取同步状态。注意,返回值是int类型,不是boolean类型。返回值大于等于0,表示获取成功。否则,表示获取失败。
boolean tryReleaseShared(int arg):共享式释放同步状态。
boolean isHeldExclusively():
把ResultSet对象转变成List对象的更多相关文章
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- 【前端】原生event对象和jquery event对象的区别
标准DOM event对象转换成 jQuery event对象 $(event) jQuery event对象转换成 标准DOM event对象 event.originalEvent
- JavaScript中本地对象、内置对象和宿主对象
链接:http://www.cnblogs.com/luckyXcc/p/5892896.html(Milk.╮的博客园提供) 其中内置对象只有两种:ECMA-262 只定义了两个内置对象,即 Glo ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象.每次写入对象都会被覆盖.弄了2个多小时终于解决了.Java默认的对象序列化是每次写入对象都会写入一点头ace ...
- 用TypeScript开发Vue——如何通过vue实例化对象访问实际ViewModel对象
用TypeScript开发Vue--如何通过vue实例化对象访问实际ViewModel对象 背景 我个人很喜欢TypeScript也很喜欢Vue,但在两者共同使用的时候遇到一个问题. Vue的实例化对 ...
- json对象与json字符串对象格式
var cStr = "{\"c\":\"{\\\"b\\\":\\\"000\\\",\\\"b2\\\&q ...
- Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理
上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...
随机推荐
- centos 设置删除提示
centos 设置删除.覆盖提示 相信好多用linux的同学都用过cp这个命令来覆盖文件,但是新建的普通用户不会有任何提示,这时候心里就咯噔一下,赶紧看看新文件的是不是传上去了.如果加上提示,是不是就 ...
- ngrok内网穿透神器
ngrok类似国内的花生壳,可以将本地的内网映射到公网上,这样就可以做web开发,微信开发了.下面就介绍下ngrok是怎么配置的吧. 方式一: 一.打开ngrok的官网https://ngrok.co ...
- Memory Limits for Windows and Windows Server Releases
来源:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx Limits on memory ...
- Redis哈希相关命令
hash类型(类似于多维数组)hset key field value 把key中filed域的值设置为value(如果之前存在就覆盖,不存在就添加) hmset key field1 value1[ ...
- js行内式遇到的一些问题 DOM对象和jq对象转换的问题
这两天给后台页面做页面,我的工作比较简单,只需要写结构和样式就行了,写好之后,后端大哥用ajax重写页面加载数据,顺便给标签添加选中事件,做选中后变色的处理,但是却遇到一个问题,一直选不到触发事件这个 ...
- Maxwell顺态求解器电磁力分析
文源:技术邻 问题描述:求解一段通有正弦交流电的直导线在某一稳态磁场中的受力情况,并简单验证仿真结果. 模型介绍: 如上几何模型中10mm边长立方体代表永磁体,材料属性为材料库中的NdFe35,修改磁 ...
- 第八十三节,CSS3动画效果
CSS3动画效果 学习要点: 1.动画简介 2.属性详解 3.简写和版本 本章主要探讨HTML5中CSS3的动画效果,可以通过类 Flash那样的关键帧模式控制运行. 一.动画简介 CSS3提 ...
- JS代码备忘
function $(v) { if (typeof v === 'function') { window.onload = v; } else if (typeof v === 'string') ...
- UITableView简单使用
在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是UITableView.当然它的广泛使用自然离不 ...
- JS复习第五章
第五章 引用类型 一.Object类型 创建object实例的方式有两种. 第一种是使用new操作符后跟object构造函数,如下所示: ver person = new Object( ) ; pe ...