คลาสพาเรนต์นามธรรม ObjectPool
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.util.Iterator;
นำเข้า java.util.Vector;
คลาสนามธรรมสาธารณะ ObjectPool<T> {
เวกเตอร์ส่วนตัว<T> ล็อค, ปลดล็อค; // locked คือชุดของวัตถุที่ถูกครอบครอง, Unlocked คือชุดของวัตถุที่มีอยู่
ObjectPool สาธารณะ () {
ล็อค = เวกเตอร์ใหม่<T>();
ปลดล็อค = เวกเตอร์ใหม่<T>();
-
//สร้างวัตถุ
ป้องกันนามธรรม T สร้าง ();
// ตรวจสอบความถูกต้องของวัตถุ
ตรวจสอบบูลีนนามธรรมสาธารณะ (T o);
// ทำให้วัตถุไม่ถูกต้อง
โมฆะนามธรรมสาธารณะหมดอายุ (T o);
// ตรวจสอบ: รับวัตถุจากกลุ่มวัตถุ
T checkOut ที่ซิงโครไนซ์สาธารณะ () {
ที ที;
ถ้า (unlocked.size() > 0) {
ตัววนซ้ำ<T> iter = unlocked.iterator();
ในขณะที่ (iter.hasNext ()) {
t = iter.ถัดไป();
if(validate(t)) { // วัตถุนั้นถูกต้อง
ปลดล็อคลบ(t);
ล็อค.เพิ่ม(t);
กลับที;
-
else { // วัตถุหมดอายุแล้ว
ปลดล็อคลบ(t);
หมดอายุ(t);
-
-
-
// ไม่มีวัตถุอยู่ในบ่อวัตถุ ให้สร้างวัตถุใหม่
t = สร้าง();
ล็อค.เพิ่ม(t);
กลับ(t);
-
// เช็คอิน: ปล่อยอ็อบเจ็กต์กลับสู่พูลอ็อบเจ็กต์
เช็คอินโมฆะซิงโครไนซ์สาธารณะ (T t) {
ล็อคลบ(t);
if(validate(t)) { // หากอ็อบเจ็กต์ยังคงใช้งานได้ ให้ใส่กลับเข้าไปในคอลเล็กชันอ็อบเจ็กต์ที่มีอยู่
ปลดล็อค.เพิ่ม(t);
-
อื่น { // มิฉะนั้นจะทำให้วัตถุโมฆะ
หมดอายุ(t);
-
-
-
คลาสย่อย JDBCConnectionPool
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.sql.Connection;
นำเข้า java.sql.DriverManager;
นำเข้า java.sql.SQLException;
JDBCConnectionPool คลาสสาธารณะขยาย ObjectPool <Connection> {
URL สตริงส่วนตัว, usr, pwd;
JDBCConnectionPool สาธารณะ (ไดรเวอร์สตริง, สตริง url, สตริง usr, สตริง pwd) {
ซุปเปอร์();
//โหลดไดรเวอร์ฐานข้อมูลที่เกี่ยวข้อง
พยายาม {
Class.forName(ไดรเวอร์).newInstance();
-
จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
นี้.url = url;
นี่ usr = usr;
นี่.pwd = pwd;
-
@แทนที่
สร้างการเชื่อมต่อที่ได้รับการป้องกัน () {
พยายาม {
กลับ DriverManager.getConnection (url, usr, pwd);
-
จับ (SQLException e) {
e.printStackTrace();
-
กลับเป็นโมฆะ;
-
@แทนที่
ตรวจสอบบูลีนสาธารณะ (การเชื่อมต่อ o) {
พยายาม {
กลับ o.isClosed();
-
จับ (SQLException e) {
e.printStackTrace();
-
กลับเท็จ;
-
@แทนที่
โมฆะสาธารณะหมดอายุ (การเชื่อมต่อ o) {
พยายาม {
o.ปิด();
-
จับ (SQLException e) {
e.printStackTrace();
-
ในที่สุด {
โอ = โมฆะ;
-
-
โมฆะคงที่สาธารณะ main (String [] args) {
JDBCConnectionPool dbConnPool = JDBCConnectionPool ใหม่ ("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");
// รับวัตถุการเชื่อมต่อฐานข้อมูล
การเชื่อมต่อ conn = dbConnPool.checkOut();
//ใช้วัตถุเชื่อมต่อฐานข้อมูล
-
// ปล่อยวัตถุการเชื่อมต่อฐานข้อมูล
dbConnPool.checkIn(conn);
-
-
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสพูล {
ส่วนตัวคงที่สุดท้าย MAX_AVAILABLE = 100;
สัญญาณสุดท้ายส่วนตัวที่มีอยู่ = สัญญาณใหม่ (MAX_AVAILABLE, จริง);
วัตถุสาธารณะ getItem() พ่น InterruptedException {
ใช้ได้.ได้รับ();
กลับ getNextAvailableItem();
-
โมฆะสาธารณะ putItem (วัตถุ x) {
ถ้า (markAsUnused(x))
ใช้ได้.ปล่อย();
-
// ไม่ใช่โครงสร้างข้อมูลที่มีประสิทธิภาพเป็นพิเศษ สำหรับการสาธิตเท่านั้น
protected Object[] items = ... รายการประเภทใดก็ตามที่ถูกจัดการ
บูลีนที่ได้รับการป้องกัน [] ใช้แล้ว = บูลีนใหม่ [MAX_AVAILABLE];
วัตถุซิงโครไนซ์ที่ได้รับการป้องกัน getNextAvailableItem() {
สำหรับ (int i = 0; i < MAX_AVAILABLE; ++i) {
ถ้า (! ใช้ [i]) {
ใช้แล้ว [i] = จริง;
ส่งคืนรายการ [i];
-
-
กลับเป็นโมฆะ; // ไม่ถึง
-
ป้องกันเครื่องหมายบูลีนซิงโครไนซ์AsUnused (รายการวัตถุ) {
สำหรับ (int i = 0; i < MAX_AVAILABLE; ++i) {
ถ้า (รายการ == รายการ [i]) {
ถ้า (ใช้แล้ว [i]) {
ใช้แล้ว [i] = เท็จ;
กลับเป็นจริง;
} อื่น
กลับเท็จ;
-
-
กลับเท็จ;
-
-