美文网首页
多线程-线程同步

多线程-线程同步

作者: Scorw | 来源:发表于2019-07-18 20:33 被阅读0次

    什么是线程安全问题:

    当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。

    线程安全解决办法:

    1. 如何解决多线程之间线程安全问题?
      答:使用多线程之间同步synchronized或使用锁(lock)。

    2. 为什么使用线程同步或使用锁能解决线程安全问题呢?
      答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。

    3. 什么是多线程之间同步?
      答:当多个线程共享同一个资源,不会受到其他线程的干扰。

    synchronized 用法

    1. 同步代码块
    synchronized(同一个数据){
     可能会发生线程冲突问题
    }
    
    1. 同步函数
      在方法上修饰synchronized 称为同步函数
    public synchronized void sale() {
               
       }
    

    同步代码块中使用的是\color{#ea4335}{this}

    1. 静态同步函数
    synchronized (ThreadTrain.class) {
    
    }
    

    修饰静态方法使用锁是当前类的字节码文件

    多线程死锁

    线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

    多线程三大特性

    1. 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
    2. 可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
    3. 有序性:程序执行的顺序按照代码的先后顺序执行。

    Java内存模型

    共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

    Volatile

    Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

    volatile与synchronized区别

    1. volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
    2. volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
    3. 仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

    相关文章

      网友评论

          本文标题:多线程-线程同步

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