【Java】白话说Java多线程篇(三),线程同步
文章目录
- 【Java】白话说Java多线程篇(三),线程同步
- 概念
- 实现线程同步
- 1.synchronized方法
- 2.synchronized块
- 死锁
- 死锁的解决方法:
概念
处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象。 这时候,我们就需要用到“线程同步”。 线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用。
如果没有实现线程同步,多个线程同时对一个数据进行操作,可能造成数据错误
实现线程同步
1.synchronized方法
通过在方法声明中加入 synchronized关键字来声明,语法如下:
public synchronized void 方法名();
synchronized 方法控制对“对象的类成员变量”的访问:每个对象对应一把锁,每个 synchronized 方法都必须获得调用该方法的对象的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
2.synchronized块
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率。
java 为我们提供了更好的解决办法,那就是 synchronized 块。 块可以让我们精确地控制到具体的“成员变量”,缩小同步的范围,提高效率。
声明格式:
synchronized(共享的对象){
//允许访问控制的代码
}
死锁
死锁指的是:
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等待对象释放资源,都停止执行的情形。
死锁的解决方法:
死锁是由于“同步块需要同时持有多个对象锁造成”的,要解决这个问题,思路很简单,就是:同一个代码块,不要同时持有两个对象锁。
// 本篇内容就是以上部分,我自己写完后也会读上一两遍,不仅为了记得更牢,也是为了确保没啥问题后再发出,不如留下个👍。