• 如何实现自定义同步组件


    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();
    }
    }
    }
    }
    }
  • 相关阅读:
    ecshop中关于语言配置项的管理
    ecshop中猜你喜欢的原理
    CSS之Position详解(自cnblogs)
    包装类
    for循环的另一种写法
    date.calendar学习总结
    java对MySql数据访问
    java中对MySql的配置
    小程序在js里获取控件的两种方式
    样式一直没生效,发现css没加前面的小点!!!
  • 原文地址:https://www.cnblogs.com/cr1719/p/6912232.html
Copyright © 2020-2023  润新知