一、什么是线程安全问题
当多个线程共享同一个全局变量,做写的操作时,可能会受到其他的线程扰,发生线程安全问题。俩线程同时对一个变量进行++操作,可能会同时打印相同数字,此时就发生了写的问题,产生了线程安全性问题。-----可能会发生线程安全性问题的代码需要上锁。
二、多线程如何解决线程安全问题并实现同步
核心思想:当多个线程共享同一个全局变量时,将可能会发生线程安全的代码上锁,
保证只有拿到锁的线程才可以执行,没有拿到锁的线程不可以执行,需要阻塞等待。
锁的类型:重入锁、悲观锁、乐观锁、公平锁、非公平锁
在同一个jvm中,多个线程需要竞争锁的资源,最终只能够有一个线程能够获取到锁,多个线程同时抢同一把锁,谁(线程)能够获取到锁,谁就可以执行到该代码,如果没有获取锁成功 中间需要经历锁的升级过程如果一致没有获取到锁则会一直阻塞等待。如果线程A获取锁成功 但是线程A一直不释放锁线程B一直获取不到锁,则会一直阻塞等待。
三、线程锁
1.synchronized锁 锁的升级过程:偏向锁->轻量级锁->重量级锁
2.Lock锁 需要自己实现锁的升级过程
3.使用Threadlocal,需要注意内存泄漏的问题。
4.原子类 CAS 非阻塞式
四、synchronized锁(重点)
public class ThreadCount implements Runnable {
public static Integer number = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(30);
} catch (Exception e) {
}
cal();
}
}
public synchronized void cal() {
if (number > 1) {
number--;
System.out.println(Thread.currentThread().getName() + "," + number);
}
}
public static void main(String[] args) {
ThreadCount threadCount1 = new ThreadCount();
new Thread(threadCount1).start();
new Thread(threadCount1).start();
}
}
当多个线程获取的锁是同一个锁,谁先拿到锁就先执行代码块或者方法,没拿到锁的就会先堵塞等待有锁的线程释放锁,在竞争锁。
1.synchronized基本使用方法
在多线程的情况下 需要是同一个对象锁
Synchronized(对象锁)
{
需要保证线程安全的代码
}
当synchronized 加在方法上面分为两种情况:
1.当方法为实例方法时候此时获取的对象锁是this锁
2.当方法是静态方法时候此时获取的对象锁是类.class锁
当加在代码块中可自定义锁
synchronized 死锁诊断工具 使用jdk中的jconsole.exe来查看死锁.
修饰代码块
public class ReviewThreadSy implements Runnable{
public Integer number = 100;
@Override
public void run() {
while (true){
synchronized (this){
if(number>1){
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace(<

本文探讨了Java多线程中的线程安全问题,包括线程安全的定义、如何通过同步机制解决这类问题。重点讲解了synchronized关键字的使用,包括代码块、实例和静态方法的同步,以及死锁的避免。同时,提到了在Spring MVC中使用synchronized的注意事项,并预告了Lock锁的简单应用。
2045

被折叠的 条评论
为什么被折叠?



