java 多线程线程安全

作者: Tim在路上 | 来源:发表于2019-09-23 11:38 被阅读0次

在多线程中使用共享资源,对共享资源的操作不是原子性,就会导致数据不一致的情况
例如 : index ++ 操作
index ++ 实际上相当于 1. index + 1 2. 将结果赋值 index

  1. 数据漏过

主要是由于线程1修改后index值已改变未输出前,cpu将权利交给线程2,线程2继续累加并输出

  1. 数据重复

主要是由于线程1执行到index +1但是还没赋值index,cpu就将执行权交给线程2

  1. 超过最大值

当index=499 时线程1和线程2都看到满足条件,线程1将index增加到500后,线程2恢复执行变为501

synchronized

synchronized 实现同步

  1. 提供一种锁机制,确保共享变量互斥访问
  2. synchronize 关键字包括 monitor enter 和 monitor exit 两个JVM,保证任何时候线程执行到monitor enter成功之前都必须从主内存中获取数据,而不是缓存,在monitor exit 运行成功后,共享变量被更新的值必须刷入主内存中
  3. synchronied 严格遵守 java happens-before 规则,一个monitor exit指令之前,必定要有一个monitor enter
  • Monitorenter

每一个对象都与一个monitor相关联,一个monitor的lock的锁只能被一个线程在同一时间获得.

如果monitor的计数器为0,则意味着monitor的lock还没有被获得,某个线程获得之后计数器加1

如果一个monitor的所有权的线程重入,则会导致moniter的计数器再次累加

如果monitor已经被其他线程所拥有,则其他线程再尝试获取所有权时,被陷入阻塞状态,直到monitor计数器变为0,才能再次获取

  • Monitor exit

释放monitor所有权就是将计数器减一,前提是必须拥有所有权

注意: 1. monitor关联对象不能为空 2. synchronized的作用域不要太大,越大效率越低
3.不同的monitor不要使用相同的锁, 4. 多个锁的交叉导致死锁
public static class Task implements Runnable{
    //这里如果初始化多个任务将使用同一个锁.
    private final Object MUTEX = new Object();
    publiv void run(){
        synchronized(MUTEX){
            
        }
    }
}

This Monitor 和 Class Monitor

在 同一个类中的两个方法上加synchronized,导致两个方法共用同一个 this monitor锁,

同样的在同一个类中的两个静态的方法,分别使用 synchronized 进行同步,两个方法被加同样的class 锁

死锁的原因

  1. 交叉锁导致死锁

A 持有 R1 等待 R2 , B 持有 R2 等待 R1

  1. 内存不足

共30M内存,A持有 10 ,B 持有 20 , 都在等待资源

  1. 一问一答数据交换

  2. 死循环造成的锁.

  3. 数据库和文件锁

相关文章

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • ConcurrentHashMap

    总结 HashMap在多线程中不安全,java提供了线程安全的ConcurrentHashMap 类,保证在多线程...

  • 多线程juc锁

    java_basic 1 线程安全 在Java多线程编程当中,实现线程安全: 内部锁(Synchronized...

  • Notes: Java下的线程安全容器小小整理

    Java下的线程安全容器 在编写多线程的Java程序时,难免会使用到各种各样的容器。Java本身提供了许多线程安全...

  • java_多线程

    java_多线程 线程创建方式;join用法; sleep和wait区别; 线程安全和不安全的java集合; St...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • kotlin 单利模式

    1. 懒汉式 java线程不安全 缺点是在多线程不能正常工作 线程安全 效率比较低 kotlin线程不安全 线程...

  • 高并发Java

    高并发Java(1):前言 高并发Java(2):多线程基础 高并发Java(3):Java内存模型和线程安全 高...

网友评论

    本文标题:java 多线程线程安全

    本文链接:https://www.haomeiwen.com/subject/wivpuctx.html