zoukankan      html  css  js  c++  java
  • 【死磕线程】线程同步机制_java多线程之线程锁

    1、线程各种状态间的切换,用图表示的话简单清晰:

    图出处:https://www.cnblogs.com/bhlsheji/p/5099362.html(博主对每个状态解释的清晰明了)

    2、为什么需要同步:

          java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 

        将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 
        从而保证了该变量的唯一性和准确性。

    3、同步的方式——锁:

    参考:http://www.cnblogs.com/goody9807/default.html?page=2

    参考:https://www.cnblogs.com/xiaoxi/p/7679470.html

    这里博主介绍了五种方式,稍后自己整理下:

    1、synchronized 同步方法或代码块

    同步开销高,尽量使用同步代码块来同步少量代码即可

    2、volatile          修饰变量

    (1)volatile关键字为域变量的访问提供了一种免锁机制;

    (2)使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新;

    (3)因此每次使用该域就要重新计算,而不是使用寄存器中的值;

    (4)volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。


    3、Lock lock = new ReentrantLock();

    在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和块具有相同的基本行为和语义,并且扩展了其能力。
    ReenreantLock类的常用方法有:
    ReentrantLock() :创建一个ReentrantLock实例
    lock() :获得锁
    unlock() :释放锁

    注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用。

    如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码 。如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁。

    4、ThreadLocal 类的常用方法

         如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。每个线程运行的都是一个副本。


    4、关于Lock对象和synchronized关键字的选择:       

    a.最好两个都不用,使用一种java.util.concurrent包提供的机制,能够帮助用户处理所有与锁相关的代码。        

    b.如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码        

    c.如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁        

    5.使用局部变量实现线程同步     如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054153.html
Copyright © 2011-2022 走看看