1、线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏。
- 多线程的执行过程不可重现,可能会造成对共享数据的破坏
- volatile可见性和有序性,但是不能保证原子性
- synchronized可以保证原子性
2、线程同步方法是通过锁(监视者)来实现,每个对象都有且仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的同步方法(可以访问静态同步方法)。
3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。
4、对于同步,要时刻清醒在哪个对象上同步,这是关键
- 同步方法–当前对象
- 静态同步方法–当前类
- 同步代码块–任意指定
5、编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对需要具有原子操作的步骤做出分析,并保证原子操作期间别的线程无法访问竞争资源(加锁处理)
- StringBuilder和StringBuffer
- JDK6+开始对synchronized进行优化,引入了偏向锁、轻量级锁和重量级锁
6、当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞
- wait方法和sleep方法
7、死锁是线程间相互等待锁锁造成的,在实际中发生的概率非常的小。真让你写个死锁程序,不一定好使。但是一旦程序发生死锁,程序将死掉、