内置锁( 关键字 Synchronized )
保证线程原子性,当线程进入方法的时候,自动获取锁,一旦锁被其他线程获取到后,其他的线程就会等待。
锁的特征:只能有一个线程进行使用。程序执行完毕后,就会把锁释放。
每一个Java对象都可以用作一个实现同步的锁,称为内置锁,线程进入同步代码块之前自动获取到锁,代码块执行完成正常退出或代码块中抛出异常退出时会释放掉锁。
内置锁为互斥锁,即线程A获取到锁后,线程B阻塞知道线程A释放锁,线程B才能获取到同一个锁。
内置锁使用synchronized关键字实现,有两种用法:
- 修饰需要进行同步的方法(所有访问状态变量的方法都必须进行同步),此时充当锁的对象为调用同步方法的对象。
- 同步代码块和直接使用synchronized修饰需要同步的方法是一样的,但是锁的粒度可以更细,并且充当锁锁的对象不一定是this,也可以是其他对象,所以使用起来更加灵活。