zoukankan      html  css  js  c++  java
  • 如何实现自定义同步组件

    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();
    }
    }
    }
    }
    }
  • 相关阅读:
    java学习笔记(二)分布式框架Dubbo+zookeeper搭建
    java学习笔记(一) 服务器的认识
    用slf4j+logback实现多功能日志解决方案 --- 转
    9.3.2 The force and release procedural statements
    3.7.4 Tri0 and tri1 nets
    9.3.1 The assign and deassign procedural statements
    10. Tasks and functions
    6.1.2 The continuous assignment statement
    df 查看磁盘使用情况
    信息学竞赛知识点整理
  • 原文地址:https://www.cnblogs.com/cr1719/p/6912232.html
Copyright © 2011-2022 走看看