Semaphore学习
Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确、合理的使用公共资源的设施,
也是操作系统中用于控制进程同步互斥的量。Semaphore是一种计数信号量,用于管理一组资源,内部是基于AQS的共享模式。
它相当于给线程规定一个量从而控制允许活动的线程数。
利用Semaphore设计一个链接池。
package com.business.thread.Semaphore;import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
//数据库连接的平庸实现
public class SqlConnectionImpl implements Connection{//重写Connection的方法,此处省略 //拿一个数据库连接public static final Connection fetchConnection() {// TODO Auto-generated method stubreturn new SqlConnectionImpl();}}
package com.business.thread.Semaphore;
//一个使用Semaphore实现的数据库连接池import java.sql.Connection;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
/*Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确、合理的使用公共资源的设施,
也是操作系统中用于控制进程同步互斥的量。Semaphore是一种计数信号量,用于管理一组资源,内部是基于AQS的共享模式。
它相当于给线程规定一个量从而控制允许活动的线程数。*/public class DBPoolSemaphore {//连接池的大小为10private final static int POOL_SIZE = 10;//存放连接的容器private static LinkedList<Connection> pool = new LinkedList<Connection>();//分别表示可用连接和已用连接private final Semaphore useFul,useLess;//初始化线程池static {for(int i=0;i<POOL_SIZE;i++) {pool.addLast(SqlConnectionImpl.fetchConnection());}}/** Semaphore主要构造方法 * Semaphore(int permits):构造方法,创建具有给定许可数的计数信号量并设置为非公平信号量。* Semaphore(int permits,booleanfair):构造方法,当fair等于true时,创建具有给定许可数的计数信号量并设置为公平信号量。 void* acquire():从此信号量获取一个许可前线程将一直阻塞。相当于一辆车占了一个车位。 void acquire(int* n):从此信号量获取给定数目许可,在提供这些许可前一直将线程阻塞。比如n=2,就相当于一辆车占了两个车位。 void* release():释放一个许可,将其返回给信号量。就如同车开走返回一个车位。 void release(int n):释放n个许可。* int availablePermits():当前可用的许可数。*/public DBPoolSemaphore(){this.useFul = new Semaphore(POOL_SIZE);this.useLess = new Semaphore(0);}//归还连接public void returnConnection(Connection connection) throws InterruptedException {if(connection!=null) {System.out.println("当前有"+useFul.getQueueLength()+"个线程等待数据库连接!"+"可用连接数: "+useFul.availablePermits());useLess.acquire();//对这个池进行加锁synchronized (pool) {pool.add(connection);} useFul.release();}}//从池子拿连接public Connection takeConnection() throws InterruptedException {useFul.acquire();Connection connection;synchronized (pool) {connection = pool.removeFirst();}useLess.release();return connection;}}
package com.business.thread.Semaphore;import java.sql.Connection;
import java.util.Random;
//测试数据库连接池
public class AppTest {private static DBPoolSemaphore dbPool = new DBPoolSemaphore();//拿数据库连接的线程private static class busiThread extends Thread{public void run() {Random r = new Random();//让每个线程有个链接时间不一样long start = System.currentTimeMillis();Connection connection;try {connection = dbPool.takeConnection();System.out.println("Thread_"+Thread.currentThread().getId()+"_获取数据库连接共耗时【"+(System.currentTimeMillis()-start)+"】ms");Thread.sleep(100+r.nextInt(100));System.out.println("查询数据完成,归还连接");dbPool.returnConnection(connection);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}public static void main(String[] args) {for(int i = 0;i<50;i++) {Thread thread = new busiThread();thread.start();}}}
Semaphore学习相关推荐
- 【博文汇总】Java程序设计语言
基础 深入理解 Java 的 Hello World 程序 Java字符串使用==进行比较实验测试与分析 Java在输出时显示System.out.print的所在类的行信息. 一个完整的Java版的 ...
- Java多线程之JUC包:Semaphore源码学习笔记
若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...
- [Systemverilog学习笔记] Thread Communication-Event、Semaphore、mailbox
[Systemverilog学习笔记] Thread Communication-Event.Semaphore.mailbox 学习目标: 通过下文了解Event.Semaphore.mailbox ...
- Java并发Semaphore信号量的学习
public class MyThreadTest {private final static Semaphore semaphore = new Semaphore(2);// 设置2个车位publ ...
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...
1.Semaphore 信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...
- C语言semaphore头文件,C语言再学习 -- 常用头文件和函数
Linux常用头文件如下: POSIX标准定义的头文件 < dirent.h> 目录项 < fcntl.h> 文件控制 < fnmatch. ...
- 操作系统学习- 二 -同步-信号量(semaphore)
信号量(semaphore) 锁的机制保证了临界区的基本要求,也帮助我们初步解决了同步互斥问题.但是基础的锁只能解决两个进程之间的同步问题在实际开发中,我们常常会遇到类似一个进程要与多个进程同步的情况 ...
- systemverilog学习 semaphore 和 mailbox
semaphore 在systemverilog中,信号量是内建的类,用于控制共享资源的访问和基本的同步.信号量像一个装有很多钥匙的桶.使用信号量的进程必须先从桶中获得一个钥匙,才可以继续执行,其它进 ...
- SV学习笔记—线程之间的通信(事件event、信箱mailbox、旗语semaphore)
目录 0.前言 1.事件event 2.信箱mailbox 3.旗语semaphore 0.前言 若多个线程之间想要进行数据交换或者知道彼此的状态以决定执行什么线程,SV中通过event.mailbo ...
最新文章
- Ubuntu环境下docker的安装
- 3月18 周作业题解
- c++程序的多文件组织
- 深入Redis内部-Redis 源码讲解
- Code片段 : .properties属性文件操作工具类 JSON工具类
- python转移环境_python 虚拟环境及项目快速迁移
- poj 2079(旋转卡壳)
- 带left join 的sql的执行顺序
- 在python中使用关键字define定义函数_python等价于'define func()'或如何在python中注释掉函数调用...
- Linux系统中使用pdb调试python代码
- Android之提交数据到服务端方法简单封装
- django之开发环境关于settins.py里面的DEBUG的设置和静态文件的关系
- 那些不需要你知道的Chrome DevTool - 使用技巧篇
- 在线小说阅读器app
- Python原生服务端签名生成请求订单信息「orderString」
- python绘制一个圆当按下键盘的上下边缘会变大和变小_元贝驾考 模拟考
- 支持响应式手机端jQuery图片轮播插件unslider
- !!return——执行了return语句,后面的语句将不会执行!!
- link2sd或者app2sd前的分区——SD卡分区教程 link2sd教程 app2sd教程
- RFC3164 – BSD Syslog协议