【Java】白话说Java多线程篇(三),线程同步


文章目录

  • 【Java】白话说Java多线程篇(三),线程同步
  • 概念
  • 实现线程同步
  • 1.synchronized方法
  • 2.synchronized块
  • 死锁
  • 死锁的解决方法:


概念

处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象。 这时候,我们就需要用到“线程同步”。 线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用。

如果没有实现线程同步,多个线程同时对一个数据进行操作,可能造成数据错误

实现线程同步

1.synchronized方法

通过在方法声明中加入 synchronized关键字来声明,语法如下:

public synchronized void 方法名();

synchronized 方法控制对“对象的类成员变量”的访问:每个对象对应一把锁,每个 synchronized 方法都必须获得调用该方法的对象的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

2.synchronized块

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率。

java 为我们提供了更好的解决办法,那就是 synchronized 块。 块可以让我们精确地控制到具体的“成员变量”,缩小同步的范围,提高效率。

声明格式:

synchronized(共享的对象){
	//允许访问控制的代码
}

死锁

死锁指的是:
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等待对象释放资源,都停止执行的情形。

死锁的解决方法:

死锁是由于“同步块需要同时持有多个对象锁造成”的,要解决这个问题,思路很简单,就是:同一个代码块,不要同时持有两个对象锁。


// 本篇内容就是以上部分,我自己写完后也会读上一两遍,不仅为了记得更牢,也是为了确保没啥问题后再发出,不如留下个👍。