1.使用特殊域变量(volatile)实现线程同步
a.volatile关键字为域变量的访问提供了一种免锁机制,
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
2.同步代码块和同步方法的区别
同步方法只能以当前类对象为锁,而同步代码块可以以任何对象为锁
public class SynchronizeCode { public static void main(String[] args) { /************ 创建锁对象 ************/ final Object lock = new Object(); /************ 开启线程一 ************/ new Thread() { public void run() { while (true) { synchronized (lock) { System.out.print("同步"); System.out.println("代码"); } } }; }.start(); /************ 开启线程二 ************/ new Thread() { public void run() { while (true) { synchronized (lock) { System.out.print("Synchronize"); System.out.println("Code"); } } }; }.start(); } }
在同步中,可以将某个对象设为锁,当持有锁时,则可以执行方法,反而,如果不持有锁,就会陷入阻塞的状态,等待上一个使用者释放锁,如果上一个使用者一直不释放锁,就会造成死锁