相关概念
线程安全的主要诱因
- 存在共享数据(临界资源)。
- 多个线程共同操作共享数据。
解决问题的根本方法:
同一时刻只有一个线程操作共享数据,其他线程必须等待该线程操作完数据后再对共享资源进行操作。
互斥锁
特性
- 互斥性:同一时刻只有一个线程持有某个对象锁。也称操作原子性。
- 可见性:锁释放之前,对共享数据的修改,对于后一个获取该锁的线程是可见的。即后一个线程获取该锁时应获得共享数据的最新值。由于JMM,每个线程都有自己的工作内存,会保存主内存的数据副本。
syncronized
syncronized 是满足互斥锁的特性。
注意:syncronized锁的都不是代码,而是对象。
获取锁的方式
根据获取的锁来分类:对象锁和类锁。
获取对象锁的方式:
- 同步代码块(syncronized(this),syncronized(类实例对象))。锁的是()中的实例对象。
- 同步非静态方法(syncronized method),锁的是当前对象的实例对象。
获取类锁的方式:
- 同步代码块(syncronized(类.class))。锁的是()中的类对象(Class对象