synchronized的作用:能够保证同一时刻最多只有一个线程执行该段代码,并达到保证并发安全的作用。
synchronized的用法:
第一种方法,对象锁(普通方法锁,代码块锁)
普通方法锁的特点
代码块锁(this)的特点
代码块锁(object)的特点
第二种方法,类锁(静态方法或锁的对象是class对象)
静态方法锁的特点:使得锁只有一个,多个调用方互斥。
代码块(class对象)锁的特点:由于class对象只有一个,所以类锁只有一个,多个线程访问的是同一把锁。
多线程访问synchronized的六种情况
两个线程访问一个对象的同步方法:串行执行
两个线程访问两个对象的同步方法:并行执行
两个线程访问静态的同步方法:串行执行
两个线程访问同一个对象的不同的普通同步方法:串行,因为是同一个对象,同一个实例,拿到的是同一把锁
两个线程,一个访问静态同步锁,另一个访问非静态同步锁:并行执行,拿到的是不同的锁
方法抛异常后,会释放锁
要领:
1一把锁只能被一个线程获取,其他线程只能等待
2每个实例都对应有自己的一把锁,不同实例之间互不影响。当锁对象是class是或者static synchronized 时,所有对象都是用的一把锁。
3方法正常执行完毕或者抛出异常,锁都会释放
synchronized 关键字的性质:
可重入:指的是同一线程的外层函数获得锁后,内层函数可以直接再次获得改锁,可重入锁是递归锁。
(不可重入:指的是线程获取了线程锁,我想再次使用,只能先释放再竞争)
可重入锁的优点:避免死锁,提升封装性。
可重入的粒度:线程级别的粒度,在一个线程中,只要拿到了锁,可以访问其他方法或者其他对象,只要这把锁有效
不可中断:一旦锁被别人获得,如果我想获得锁,只能等待或者阻塞,直到别人释放锁。自己没有中断别人锁的权力,也没有推出等待的能力。