• 使用semaphore写一个显示锁


    /**
     * 这里只是将Semaphore包装了一下,注意当Semaphore的构造参数是1时,本身就是一个显示锁
     */
    public class SemaphoreLock {
    
        private final Semaphore semaphore = new Semaphore(1);
    
        public void lock() throws InterruptedException {
            semaphore.acquire();
        }
    
        public void  unlock(){
            semaphore.release();
        }
    
        public static void main(String[] args) {
            SemaphoreLock lock = new SemaphoreLock();
    
            for(int i=0; i<2; i++){
                new Thread(()->{
                    try {
                        System.out.println(Thread.currentThread().getName() + " is running ");
                        lock.lock();
                        System.out.println(Thread.currentThread().getName() + " get the lock ");
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                    System.out.println(Thread.currentThread().getName() + " release  the lock ");
                }).start();
            }
        }
    
    
    }

    这个例子就是把semaphore当成了普通的显示锁

    public class SemaphoreLock {
        public static void main(String[] args) {
            //1、信号量为1时 相当于普通的锁  信号量大于1时 共享锁
            Output o = new Output();
            for (int i = 0; i < 5; i++) {
                new Thread(() -> o.output()).start();
            }
        }
    }
    class Output {
        Semaphore semaphore = new Semaphore(1);
    
        public void output() {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + " start at " + System.currentTimeMillis());
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + " stop at " + System.currentTimeMillis());
            }catch(Exception e) {
                e.printStackTrace();
            }finally {
                semaphore.release();
            }
        }
    }

    note:这里的semaphore只是当成了"lock",与真实的lock的区别是,真实的lock必须由lock的持有者进行释放,而semaphore可有由其他的线程来释放

  • 相关阅读:
    odoo开发笔记 -- 新建模块扩展原模块增加菜单示例
    div内部div居中
    Css中!important的用法
    SQLServer日期格式转换
    jquery中innerheight outerHeight()与height()的区别
    简单明了区分escape、encodeURI和encodeURIComponent
    PDF预览之PDFObject.js总结
    PDFObject.js,在页面显示PDF文件
    System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath的用法
    angular 模块 @NgModule的使用及理解
  • 原文地址:https://www.cnblogs.com/moris5013/p/11876794.html
Copyright © 2020-2023  润新知