Java多线程之《自定义锁实现》

Mutex

Mutex为自定义独占锁。Sync为静态内部类,自定义同步器,继承AbstractQueuedSynchronizer。

package concurrent;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;

/**
 * Desc:自定义独占锁
 * Creator: pengweixiang
 * Date: 2019-04-07
 */
public class Mutex implements Lock
{
    /**
     * 静态内部类,自定义同步器
     */
    private static class Sync extends AbstractQueuedSynchronizer
    {
        /**
         * 是否为占用状态
         *
         * @return boolean
         */
        @Override
        protected boolean isHeldExclusively()
        {
            return getState() == 1;
        }

        /**
         * 获取锁
         *
         * @param acquires
         * @return
         */
        @Override
        protected boolean tryAcquire(int acquires)
        {
            if (compareAndSetState(0, 1))
            {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }

        /**
         * 释放锁
         *
         * @param release release
         * @return
         */
        @Override
        protected boolean tryRelease(int release)
        {
            if (getState() == 0)
            {
                throw new IllegalMonitorStateException();
            }
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }

        /**
         * 返回一个Condition,每个condition都包含一个condition队列
         *
         * @return condition
         */
        Condition newCondition()
        {
            return new ConditionObject();
        }
    }

    private final Sync sync = new Sync();

    public void lock()
    {
        sync.acquire(1);
    }

    public boolean tryLock()
    {
        return sync.tryAcquire(1);
    }

    public void unlock()
    {
        sync.release(1);
    }

    public Condition newCondition()
    {
        return sync.newCondition();
    }

    public boolean isLock()
    {
        return sync.isHeldExclusively();
    }

    public boolean hasQueuedThread()
    {
        return sync.hasQueuedThreads();
    }

    public void lockInterruptibly() throws InterruptedException
    {
        sync.acquireInterruptibly(1);
    }

    public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
    {
        return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }
}

MutexTest

package concurrent;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Desc:
 * Creator: pengweixiang
 * Date: 2019-04-14
 */
public class MutexTest
{
    private static Lock lock = new Mutex();

    public static void main(String[] args)
    {
        MutexTest mutexTest = new MutexTest();
        ThreadTask threadTask1 = mutexTest.new ThreadTask("Task 1");
        ThreadTask threadTask2 = mutexTest.new ThreadTask("Task 2");
        ThreadTask threadTask3 = mutexTest.new ThreadTask("Task 3");
        threadTask1.start();
        threadTask2.start();
        threadTask3.start();
    }

    class ThreadTask extends Thread
    {
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");

        public ThreadTask(String name)
        {
            super(name);
        }

        @Override
        public void run()
        {
            lock.lock();
            try
            {
                System.out.println(Thread.currentThread().getName() + ", Time: " + sdf.format(new Date()));
                TimeUtils.sleep(5);
            }
            finally
            {
                lock.unlock();
            }
        }
    }
}

运行结果

每个线程运行5秒钟,才执行下一个线程。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值