Synchronized
线程安全原因:
- 存在共享数据(临界资源)
存在多个线程共同操作共享数据
所以:
保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再进行(就是互斥锁)
synchronized可以保证
- 在同一个时刻,只有一个线程可以执行某个方法或者某个代码块
- 一个线程的变化 (主要是共享数据的变化) 被其他线程所看到
synchronized的三种应用方式
修饰 | 作用对象 |
---|---|
实例方法 | 给this加锁 |
静态方法 | 给类加锁 |
代码块 | 指定对象加锁 |
当一个线程正在访问一个对象的 synchronized 实例方法,那么其他线程不能访问该对象的其他 synchronized 方法,毕竟一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized实例方法,但是其他线程还是可以访问该实例对象的其他非synchronized方法,