• 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) //参数是给对方的数据,返回值是对方发来的数据

  • 相关阅读:
    PAT:1006(换个格式输出整数想·)
    PAT 1008(数组循环右移问题)
    kaliLinux 工具dmitry参数解析
    PAT 1004(成绩排名)(C++)
    PAT乙级:我要通过(1003)
    PAT乙级:写出这个数(1002)
    PAT乙级:(3n+1)猜想 (1001)
    Linux初体验
    C语言基础入门:起源
    Linux_ pipe 匿名管道 浅解
  • 原文地址:https://www.cnblogs.com/gushiye/p/13837911.html
Copyright © 2020-2023  润新知