synchronized用过吗?怎么使用?
synchronized经常用的,用来保证代码的原子性。
synchronized主要有三种用法:
- 修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁。
- 修饰静态方法:给当前类加锁,在同一时间内,只能有一个线程持有该类对应的 Class 对象的锁,其他线程需要等待锁的释放才能继续执行该静态方法。
- 修饰代码块 :指定一个同步锁对象,这个对象可以是具体的Object或者是类.class。在同一时间内,只能有一个线程持有该同步锁对象的锁,其他线程需要等待锁的释放才能继续执行该代码块。
注意事项:
- 修饰实例方法:不同的对象实例之间并不会互相影响,它们的锁是相互独立的。因此,如果不同的线程在不同的对象实例上执行同一个同步方法,它们之间并不会因为共享变量而产生互斥的效果。
- 修饰静态方法:应该尽量避免持有锁的时间过长,否则可能会导致其他线程长时间等待,从而影响系统性能。同时,也要注意避免死锁的情况。
- 修饰代码块:同步锁并不是对整个代码块进行加锁,而是对同步锁对象进行加锁。因此,如果在不同的代码块中使用了相同的同步锁对象,它们之间也会产生互斥的效果。而如果使用不同的同步锁对象,则它们之间并不会产生互斥的效果。
![](/images/780-200-2.jpg)