多线程内存模型
- 线程私有栈内存
- 每个线程 私有的内存区域
- 进程公有堆内存
- 同一个进程 共有的内存区域
为什么会有线程安全问题?
- 多个线程同时具有对同一资源的操作权限,又发生了同时对该资源进行读取、写入的情况,那么就会出现重复操作的情况
如何解决线程安全问题呢? 加锁
什么是锁?
锁就是对于操作资源的一种权限
锁可以做什么?
对于一个资源加锁后,每次只能有一个线程对该资源进行操作,当该线程操作结束后,才会解锁。
解锁之后,所有的线程获得竞争此资源的机会。
什么情况下需要加锁?
- 读读 不需要加锁
- 写写 需要加锁
- 读写 需要加锁
加锁的两种方式(synchronized关键字与Lock对象)
第一种:synchronized关键字
-
方法前加synchronized关键字
- 功能:线程进入用synchronized声明的方法时就上锁,方法执行完自动解锁,锁的是当前类的对象
- 调用synchronized声明的方法一定是排队运行的
- 当A线程 调用object对象的synchronized声明的X方法时
- B线程可以调用其他非synchronized声明的方法
- B线程不能调用其他synchronized声明的非X方法
-
synchronized锁重入
- 锁重入的概念:自己可以重复获得自己的内部锁。即synchronized声明的方法,可以调用本对象的其他synchronized方法。
- 锁重入支持继承的环境,即子类的synchronized方法也可以调用父类的synchronized方法。
-
synchronized同步代码块
-
synchronized关键字与synchronized代码块的区别
- synchronized声明的方法是将当前对象作为锁
- synchronized代码块是将任意对象作为锁
-
当两个线程访问同一个对象的synchronized代码块时,
-