浅谈线程同步的几种方法

一、为何要使用同步

  同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。

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

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

二、同步的几种方法

  1,同步代码块 

        即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
  2,同步方法
     即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
  3,使用特殊域变量(volatile)实现线程同步
        a:volatile关键字为域变量的访问提供了一种免锁机制, 
        b:使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新, 
        c:因此每次使用该域就要重新计算,而不是使用寄存器中的值 
        d:volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
      其他代码不变,只需要在定义变量的时候用volatile
  4,使用wait(),notify(),notifyAll()实现线程同步
    wait()必须在有synchronized修饰的地方使用,  调用wait()后线程放弃锁,进入等待,调用notify(),notifyAll()唤醒线程;
  5,sleep()使线程进入阻塞状态
    不是严格意义上的同步方法,但在一些特殊场景下可以进行同步应用
 
 
 
原文地址:https://www.cnblogs.com/muzilee/p/7061548.html