博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lock
阅读量:6618 次
发布时间:2019-06-25

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

public class Outputter {        private Lock lock = new ReentrantLock();    public void output(String name){        lock.lock();    //得到锁        try{            for(int i = 0; i < name.length();i++){                System.out.print(name.charAt(i));            }        }catch(Exception e){            e.printStackTrace();        }finally{            lock.unlock();    //释放锁        }    }    }
public class LockTest {    public static void main(String[] args) {        final Outputter outputter = new Outputter();        new Thread(){            public void run(){                outputter.output("Chinaese ");            }        }.start();        new Thread(){            public void run(){                outputter.output("Chinaese ");            }        }.start();        new Thread(){            public void run(){                outputter.output("Chinaese ");            }        }.start();    }    }

上述代码可以解决线程安全问题,效果和synchronized一样。不同的是,synchronized修饰的方法或者代码块执行完后自动释放锁,而lock需要手动释放锁。

对于数据区的内容,我们要做到  读写互斥  写写互斥 读读不互斥(这里先考虑读读互斥)

/** * 显然不满足我们的需求 * 我们需要实现的是:读写互斥   写写互斥  读读不互斥 * @author hp * */public class ReadWriteLockTest {    public static void main(String[] args) {        final Data data = new Data();        for(int i = 0;i<3;i++){            new Thread(new Runnable(){                public void run() {                    for(int i = 0; i< 5;i++){                        data.set(new Random().nextInt(30));                    }                }            }).start();        }                for(int i = 0;i  < 3;i++){            new Thread(new Runnable(){                public void run() {                    for(int i = 0;i< 5;i++){                        data.get();                    }                }            }).start();        }    }        /*static class Data{        private int data;                public void set(int data){            System.out.println(Thread.currentThread().getName()+"准备写数据");            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            this.data = data;            System.out.println(Thread.currentThread().getName()+"写入数据"+data);        }                public void get(){            System.out.println(Thread.currentThread().getName()+"准备读取数据");            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName()+"读取"+this.data);        }            }*/            static class Data{        private int data;        private ReadWriteLock rwl = new ReentrantReadWriteLock();        public void set(int data){            rwl.writeLock().lock();            try {                System.out.println(Thread.currentThread().getName()+"准备写数据");                Thread.sleep(20);                this.data = data;                System.out.println(Thread.currentThread().getName()+"写入数据"+data);            } catch (InterruptedException e) {                e.printStackTrace();            }finally{                rwl.writeLock().unlock();            }        }                public void get(){            rwl.readLock().lock();            try {                System.out.println(Thread.currentThread().getName()+"准备读取数据");                Thread.sleep(20);                System.out.println(Thread.currentThread().getName()+"读取"+this.data);            } catch (InterruptedException e) {                e.printStackTrace();            }finally{                rwl.readLock().unlock();            }        }            }    }

 

转载于:https://www.cnblogs.com/lfdingye/p/7444504.html

你可能感兴趣的文章
16.1 Tomcat介绍
查看>>
QuickBI助你成为分析师——数据源FAQ小结
查看>>
十周三次课
查看>>
S/4HANA服务订单Service Order的批量创建
查看>>
2008 AD 复制有防火墙要开什么端口
查看>>
IT服务管理中的知识库建设
查看>>
【Lucene】Lucene通过CustomScoreQuery实现自定义评分
查看>>
我的友情链接
查看>>
敏友的【敏捷个人】有感(11): 敏捷个人线下活动有感
查看>>
刺激用户危机意识,实现快速盈利的营销思维
查看>>
JUnit单元测试
查看>>
[logstash-input-file]插件使用详解
查看>>
植物大战僵尸
查看>>
原创文章
查看>>
理解JavaScript私有作用域
查看>>
BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
查看>>
Drupal 7模板(主题钩子)的建议
查看>>
nginx配置文件中location说明
查看>>
连载-第1章绪论 1.1嵌入式系统概述
查看>>
UltraVNC
查看>>