博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何实现自定义同步组件
阅读量:5290 次
发布时间:2019-06-14

本文共 3061 字,大约阅读时间需要 10 分钟。

package com.chen; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; /**  * desc:自定义同步组件,只允许最多n个线程同时访问  * // 1.共享访问  * // 2.定义n个资源数  * Created by chenjianye on 2017/5/26.  */ public class ServerLock implements Lock{
private Sync sync = null; public ServerLock(int ServerLockNum) {
this.sync = new Sync(ServerLockNum); } private final class Sync extends AbstractQueuedSynchronizer {
Sync(int count){
setState(count); } public int tryAcquireShared(int reduceCount) {
for(;;) {
int current = getState(); int newCount = current - reduceCount; if (newCount < 0 || compareAndSetState(current, newCount)) {
return newCount; } } } public boolean tryReleaseShared(int returnCount) {
for(;;) {
int current = getState(); int newCount = current + returnCount; if (compareAndSetState(current, newCount)) {
return true; } } } } @Override public void lock() {
// sync.acquire(1); sync.acquireShared(1); } @Override public void unlock() {
sync.releaseShared(1); } @Override public void lockInterruptibly() throws InterruptedException {
System.out.println("dd"); } @Override public boolean tryLock() {
return false; } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(1000)); } @Override public Condition newCondition() {
throw new RuntimeException(""); } }
package com.chen; import java.util.concurrent.locks.Lock; /**  * desc:测试自定义锁  * Created by chenjianye on 2017/5/26.  */ public class TestLock {
public static void main(String[] args) {
ServerLock lock = new ServerLock(4); // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); // Lock tmp = lock.writeLock(); for(int i=0;i<20;i++) {
Worker worker = new Worker(lock); worker.start(); } } static class Worker extends Thread{
Lock lock; Worker(Lock lock) {
this.lock = lock; } public void run() {
while (true) {
lock.lock(); try{
Thread.sleep(1000); System.out.println("Thread name:" + Thread.currentThread().getName()+"时间:"+System.currentTimeMillis()/1000); } catch (InterruptedException e) {
e.printStackTrace(); } finally {
lock.unlock(); } } } } }

转载于:https://www.cnblogs.com/cr1719/p/6912232.html

你可能感兴趣的文章
转载:编剧技巧思路乱谈
查看>>
Linux centos7 rsync工具介绍、rsync常用选项、rsync通过ssh同步
查看>>
函数堆栈
查看>>
关于在linux系统下安装jdk
查看>>
请帮我看看这个页面,红色部份如何改才能保存到ACCess数据库中
查看>>
Oracle数据库初学者入门教程
查看>>
PHP实现栈(Stack)数据结构
查看>>
python常见问题及解决
查看>>
[原创]Java 的传值小例子
查看>>
【MySQL学习】安装和配置 服务无法启动 没有报告任何错误
查看>>
C# 修饰符
查看>>
JavaScript启示录
查看>>
我需要什么样的浏览器?
查看>>
取textaera里的值
查看>>
java设计模式1--工厂方法模式(Factory Method)
查看>>
博客第一弹—聊聊HTML的那些事
查看>>
上海2017QCon个人分享总结
查看>>
HIVE快速入门 分类: B4_HIVE 2015-...
查看>>
Mysql安装方法及安装问题解决
查看>>
Java动态代理的两种实现方式:
查看>>