一、为何要使用同步
同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。
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()使线程进入阻塞状态
不是严格意义上的同步方法,但在一些特殊场景下可以进行同步应用