把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 异常处理
上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...
随机推荐
- 私有云Rabbitmq 集群部署
默认openstack使用rabbitmq做信息队列,如果想要是云高可用,那么需要对每个涉及的组件都进行高可用配置,本文介绍如何使用rabbitmq 做高可用 高可用方法 通过 Erlang 的分布式 ...
- 一个初学者的辛酸路程-socket编程-8
前言: 你会发现会网络是多么幸福的事情 主要内容: socket 概念: socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络通信都是基于 ...
- pychon - selenium2Libray源码简介
I. Introduction Selenium2Library是robot framework中主流的测试网页功能的库, 它的本质是对webdriver的二次封装, 以适应robot框架. 百度上一 ...
- power oj 2480 放积木[二进制状压DP]
题目链接[https://www.oj.swust.edu.cn/problem/show/2480] 题意:中文题目. 题解:二进制状态转移+坏点判断. #include<cstdio> ...
- C++ 简史
Bjarne Stroustrup 这哥们在剑桥读博的时候,需要实现一个分布式的操作系统.仔细一想,自己在丹麦读大学的时候就用过 Simula,记得它的「类型表达」.「编译排错」能力以及「类」和「协程 ...
- POJ - 1330 Nearest Common Ancestors(基础LCA)
POJ - 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %l ...
- java 中文乱码
1.URL编码 String str = URLEncoder.encode("中文乱码","UTF-8");//编码 String newStr = URLD ...
- HBase表删除问题
HBase shell下用list命令查看表,出现错误:找不到表 格式化zookeeper,删除.opt/zookeeper下除了myid的文件 重启集群 再进入HBase shell,list可以查 ...
- wangEditor的jQuery插件化
wangEditor是一款优秀的Web富文本编辑器.这篇随笔中讲述的wangEditor版本是2.1.22,由于它依赖于jQuery(作者打算在第三版中取消对jQuery的依赖),那么如果能使用$(& ...
- 【转】cookie和session的区别
原作者:施杨(施杨's Think out)出处:http://shiyangxt.cnblogs.com ************** 本文版权归原作者和博客园共有,欢迎转载,转载请保留该申明 ** ...