该文章主要讲解如何快速应用Lock和synchronized

读者可以自行学习Lock和synchronized系统级比较;可参考并发实战等,自己决定什么场景下使有哪种锁

Lock使用案例:

public class Person {  //两个线程同时调用这个方法
    public void say(String msg){
        int len = msg.length();
        for(int i=0;i<len;i++){
            System.out.print(msg.charAt(i));
        }
        System.out.println();
    }
}
public class LockTest {
    public static void main(String[] args) {
        Person person = new Person();
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    person.say("haohaoxuexi");
                }
            }
        }).start();

        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    person.say("tiantianxiangshang");
                }
            }
        }).start();
    }
}

输出的结果:

haohaoxuexi
  tianhaohaoxuexitianxiangshang


hatiantianxiangshangoha
  oxuexi
  htiantianxiangshangaohaoxuexi

 

以上结果是随机生成的,每次的结果可能都不一样;主要证明并发一个对象方法时候存在线程安全问题

修改方法:

public class Person {
  //为对象创建一把锁
    Lock lock = new ReentrantLock();

    public void say(String msg){
        int len = msg.length();     //加锁
        lock.lock();
        try{
            for(int i=0;i<len;i++){
                System.out.print(msg.charAt(i));
            }
            System.out.println();
        }finally{       //解锁
            lock.unlock();
        }
    }
}

此时是结果正常:

  tiantianxiangshang
  haohaoxuexi
  tiantianxiangshang
  haohaoxuexi
  tiantianxiangshang
  haohaoxuexi
  tiantianxiangshang
  haohaoxuexi

 

基于Lock读写锁的案例:

public class Cache {
    //创建一个缓存
    private static Map<String, Object> cache = new HashMap<String, Object>();
    //创建读写锁
    private static ReadWriteLock rwl = new ReentrantReadWriteLock();
    public static Object getData(String key){
        //加读锁
        rwl.readLock().lock();
        Object value = null;
        try{
            value = cache.get(key);
            if(value == null){
                //释放读锁
                rwl.readLock().unlock();
                //加写锁
                rwl.writeLock().lock();
                try{
                    if(value==null){
                        value = "查询介质获取数据";
                        cache.put(key, value);
                    }
                }finally{
                    //加读锁
                    rwl.readLock().lock();
                    //释放写锁
                    rwl.writeLock().unlock();
                }
            }
        }finally{
            //释放读锁
            rwl.readLock().unlock();
        }
        return value;
    }
}

synchronized使用案例

public class Person {
  //两个线程同时调用这个方法
    public void say(String msg){
        int len = msg.length();
        for(int i=0;i<len;i++){
            System.out.print(msg.charAt(i));
        }
        System.out.println();
    }
}

把上述代码修改成以下即可

public class Person {
    public synchronized void say(String msg){
        int len = msg.length();
        for(int i=0;i<len;i++){
            System.out.print(msg.charAt(i));
        }
        System.out.println();
    }
}

或者修改成以下代码

public class Person {
    public void say(String msg){
        int len = msg.length();
        synchronized(Person.class){
            for(int i=0;i<len;i++){
                System.out.print(msg.charAt(i));
            }
            System.out.println();
        }
    }
}

Lock和synchronized使用的更多相关文章

  1. (转)Lock和synchronized比较详解

    今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...

  2. Lock较synchronized多出的特性

    1.尝试非阻塞形式获取锁 tryLock() :当前线程尝试获取锁,如果锁被占用返回false;如果成功则占有锁 //类似用法if(lock.tryLock()) { try { System.out ...

  3. Java中的Lock与synchronized

    并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...

  4. Lock和Synchronized

    1.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取锁2.Lock中的某些锁允许对共享资源的并发访问,如ReadWriteLock读写锁,readLock()获取读锁,wri ...

  5. Lock与synchronized的区别(浅谈)

    Lock是一个接口 synchronized是一个关键字 Lock用法:                                 synchronized用法:    lock.lock()  ...

  6. Java同步锁——lock与synchronized 的区别【转】

    在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...

  7. 线程(六)之LOCK和synchronized

    在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock.ReadWriteLock(实现类ReentrantReadWriteLock), ...

  8. Lock和synchronized的区别和使用

    Java并发编程:Lock 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问 ...

  9. java多线程关键字volatile、lock、synchronized

    --------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...

  10. Lock、synchronized和ReadWriteLock,StampedLock戳锁的区别和联系以及Condition

    https://www.cnblogs.com/RunForLove/p/5543545.html 先来看一段代码,实现如下打印效果: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 1 ...

随机推荐

  1. js的validate插件异步效验

    js代码 $(function () { $("#regForm").validate({ onsubmit:true,// 是否在提交是验证 onkeyup: false, // ...

  2. 解决代码加载慢,以至于乱码—————VUE

    vue.js解决开始代码加载,以至于乱码 vue.js通过几行代码可以解决这个问题 css: [v-cloak] { display: none; } html: <div id="a ...

  3. MT41J256M16HA-125 原厂订购 现货销售

    作为一家科研公司,保证芯片的原厂品质和正规采购渠道是科学严谨的研发工作中重要的一环,更是保证研发产品可靠.稳定的基础.而研发中所遇到的各种不可预测的情况更是每个工程师向技术的山峰攀登中时会遇到的各种难 ...

  4. Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

      linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执 ...

  5. Less 混合(mixin)

    Less的混合:混合可以将一个定义好的class A轻松的引入到另一个class B中,从而简单实现class B继承class A中的所有属性.我们还可以带参数地调用,就像使用函数一样. .bord ...

  6. HTML5 中list 和datalist实例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. @ControllerAdvice全局数据预处理

    在传统项目的Controller的方法中传入参数,对象中的属性相同时,会出现以下错误         Book类和Author类     这是因为两个对象中的name相同,传参时分不清西游记和六小龄童 ...

  8. 调试IPV6

    从Mac分享IPV6 WIFI的方法: 按住opition + 系统设置中的share 进入 如果被拒了要上诉或者回复审核团队邮件,可以参考这个写: 尊敬的APP审查委员会: 您们好!我们希望将自己开 ...

  9. 本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口

    QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将“js?”后面的appid参数(示例代码中的:100229 ...

  10. C++ Map相同key是否覆盖问题分析

    C++的标准库关联容器map是不允许有key相同的键值对存在的.那么当key已经存在的情况下,我们再次插入相同的key,那么key的value会被覆盖吗? 测试代码: 测试结果: 从测试结果我们可以得 ...