zoukankan      html  css  js  c++  java
  • java回顾之多行代码的线程安全问题以及并发包

    java回顾之多行代码的线程安全问题以及并发包

    一、线程安全问题

    1.1、多行代码执行顺序的问题

    产生的原因就是多个线程操作了共享的数据

    解决办法使用synchronized关键字

    1.2、synchronized关键字

    synchronized关键字表示同步或串行化,将多行代码当成是一个整体,一个线程进入这个代码块中,只有全部执行完毕结束后,其他线程才会执行。

    同步代码块

    格式

    synchronized(锁){                            锁可以是任何类型的对象,多个线程使用同一个锁对象

      共享的数据放在里面

    }

    同步方法

    将关键字加在方法上,就是同步方法

    //非静态同步方法
    public synchronized void method(){
        锁对象是当前类的this对象
    }
    非静态方法往往是本对象创建出来了
    
    //静态同步方法
    public static synchronized void method(){
        锁对象是当前类的字节码对象 XXX.class
    }
    静态方法都是对象共享的,还用对象的话,地址不同,锁就失效了,这是原理,方法直接用就行

    二、lock锁

    两个方法,加锁和解锁  lock()和unlock()解锁

    这里注意之所以在if里面加解锁,是因为break就结束了,不加的话其他线程进不来,同时注意这是非公平锁,线程会不但的插队,数据太少,线程太少,效果可能演示不出来,一个线程一直插队,自己就全跑完了。

    二、并发包

    2.1CopyOnWriteArrayList

    ArrayList在多线程的情况下线程不安全,CopyOnWriteArrayList是一个线程安全的集合

    2.2CopyOnWriteArraySet

    HashSet是线程不安全的,CopyOnWriteArraySet是线程安全的

    2.3ConcurrentHashMap

    HashMap是线程不安全的,Hashtable和ConcurrentHashMap是线程安全的

    Hashtable和ConcurrentHashMap的速度区别

    Hashtable解决线程安全的方式

    每个方法全都是同步的,当任意一个方法在执行时,别的方法都不能执行。

    ConcurrentHashMap

    CAS + 局部(synchronized)锁定

     

    Hashtable执行的速度慢
    ConcurrentHashMap执行效果快

    三、CountDownLatch

    CountDownLatch允许一个或多个线程等待其他线程完成操作

    方法介绍:

    new CountDownLatch(int count)// 初始化一个指定计数器的CountDownLatch对象

    void await() // 让当前线程等待
    void countDown() // 计数器进行减1,如果减到0等待的线程就会执行

    四、Semaphore

    Semaphore的主要作用是控制线程的并发数量

    public Semaphore(int permits)       //permits 表示许可线程的数量
    public Semaphore(int permits, boolean fair)      //fair 表示公平性,如果这个设 为 true 的话,下次执行的线程会是等待最久的线程

     

    五、Exchanger

    Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行两个线程间的数据交换。

    方法介绍:

    new Exchanger() //构造方法,创建对象
    V exchange(V x) //参数是给对方的数据,返回值是对方发来的数据

  • 相关阅读:
    restFul接口设计规范[仅供参考]
    Vue的router路由跳转传参——实现跳转时url不显示参数
    vue-cli(vue脚手架)搭建超详细教程
    Vue面试常见问题
    Ubuntu18.04安装时的一些问题
    仿BBS项目
    前端常用正则校验
    orm数据库查询优化及数据库三大设计范式总结
    SpringBoot+Git+Jenkins+Docker实现CI/CD
    Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦
  • 原文地址:https://www.cnblogs.com/gushiye/p/13837911.html
Copyright © 2011-2022 走看看