【多线程并发访问的安全性问题】
今天重新温习了一下多线程并发访问的问题,加强下记忆,决定写一些东西记录下来。【持续更新】
多线程并发访问的安全性问题
首先要知道的是:多线程安全性问题产生的原因是什么?
多线程并发访问是指当多个线程无序的访问同一个共享资源时,这个线程就受到了“多个线程的并发访问”。
多线程并发访问的安全问题
在出现多个线程并发访问的时候,这时就有可能产生并发访问的安全性问题,可能会导致共享资源的最后结果不是我们期望的结果。(此处不做具体演示)
该如何解决多线程并发访问的安全问题呢?
利用【线程同步】可以解决多线程并发访问的安全性问题。
线程同步的方式有三种:(如果还有其他方式,欢迎诸位大佬补充)
- 同步方法【最常用】
- 同步代码块
- 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();//解锁
}
}
···························································································································································
写的东西不算多,欢迎诸位大佬补充。
持续更新,共同进步!