【多线程并发访问的安全性问题】

【多线程并发访问的安全性问题】

今天重新温习了一下多线程并发访问的问题,加强下记忆,决定写一些东西记录下来。【持续更新】

多线程并发访问的安全性问题

首先要知道的是:多线程安全性问题产生的原因是什么?

多线程并发访问是指当多个线程无序的访问同一个共享资源时,这个线程就受到了“多个线程的并发访问”。

多线程并发访问的安全问题

在出现多个线程并发访问的时候,这时就有可能产生并发访问的安全性问题,可能会导致共享资源的最后结果不是我们期望的结果。(此处不做具体演示)

该如何解决多线程并发访问的安全问题呢?

利用【线程同步】可以解决多线程并发访问的安全性问题。

线程同步的方式有三种:(如果还有其他方式,欢迎诸位大佬补充)
  1. 同步方法【最常用】
  2. 同步代码块
  3. Lock锁(JDK1.5以后新出的锁)
同步方法

我这里写一个方法:

public synchronized int getNumber(){
//被同步的代码。。
}

当一个线程进入到方法时,会立即锁死这个方法,其他线程会在外边等待。为啥呢?因为在加了synchronized同步锁之后,其他线程进不来,当内部的线程线程执行完之后,其他的线程才能进来,以此类推。这样可以保证每个线程可以完整的执行完,这样就避免了多线程并发访问的安全问题。

同步代码块

通过锁对象,来完成对线程的同步。

private Object obj = new Object();
public synchronized int getNumber(){
  synchronized(obj){
   //被同步的代码。。
  }
}

这里是通过锁对象,保证多个线程进来后,访问到的都是一个对象,来完成对线程的同步。它可以出现在方法内部,一个方法内可以有多个同步代码块。

Lock锁

Lock它是一个接口,是在JDK1.5以后新出的锁。它的具体实现类诸位可自行查阅。

Lock lock = new Lock的实现类
public synchronized int getNumber(){
  lock.lock();//加锁
  try{
     //被同步的代码。。
  }finally{
    lock.unlock();//解锁
     }
  }

···························································································································································
写的东西不算多,欢迎诸位大佬补充。
持续更新,共同进步!

猜你喜欢

转载自blog.csdn.net/qq_42384113/article/details/85919994