多线程同步(线程间同步)

多线程同步(线程间同步)

多线程实现同步

  多线程的三大特性:

  原子性:即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

  可见性:当多个线程访问一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值

  有序性:程序执行的顺序按照代码的先后顺序执行
多线程实现同步:

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

  线程安全解决方法:使用多线程之间同步synchronized或者使用lock(锁)

  同一时间只让当前一个线程进行对数据进行执行操作,当前线程执行完成后释放锁,才能让其他线程进行操作执行,避免了同时对数据的操作,这样的华就可以解决线程的不安全问题,也就是实现了数据的同步

  synchronized两种用法:

  第一种:将可能会发生线程安全问题的代码,给包括起来,称为同步代码块

  第二种:在方法上修饰synchronized,称为同步函数

  静态同步函数使用的锁是该函数所属字节码文件对象,可以使用getClass()方法获取,也可以用当前类名.class表示
同步的前提:

  1.要有两个或者两个以上的线程,否则没有意义

  2.多线程使用同一个锁

  必须保证同步中只有一个线程运行

   
什么是Volatile?

  volatile是java提供的一种同步手段,它是轻量级的同步,只能修饰变量,只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。

  任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都会及时写在主存。因此对于volatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的。

   volatile与synchronized区别:

  仅靠volatile不能保证线程的安全性,也就是原子性

  ①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法。

  ②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

  synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

   

  线程安全性:

  线程安全性包括两个方面,①可见性。②原子性。

  从上面可以看出:仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/23602.html

(0)
上一篇 2023-10-23
下一篇 2023-10-23

相关推荐

  • fastpitch和fastspeech2_模型检验的方法

    fastpitch和fastspeech2_模型检验的方法本文件主要是定义Variance Adaptor,其中主要包括Duration Predictor、Length Regulator、Pitch

    2022-12-14
    158
  • 【计算机网络】socket编程

    【计算机网络】socket编程@TOC 1. 网络通信的理解 主机A将自己的数据交给主机B,就需要给主机B发送消息,主机B未来要给主机A回消息 但实际上 主机A将自己的数据交给主机B 并不是最终目的 如:你在淘宝上买了一件衣服,卖

    2023-11-12
    134
  • MySQL事务的详细讲解「终于解决」

    MySQL事务的详细讲解「终于解决」摘要:本篇博客将详细讲解MySQL事务的概念、特性、操作方法以及相关的问题和解决方案。我们将通过具体的SQL执行示例来说明事务的使用,并解释My

    2023-05-23
    151
  • c++简单工厂模式_C++ 工厂模式

    c++简单工厂模式_C++ 工厂模式什么是简单工厂模式?简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式,通过专门定义一个人来负责创建其他类的实例,被创建的实例通常都具有共同

    2022-12-14
    155
  • mysql事务的原理_mysql大事务

    mysql事务的原理_mysql大事务事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个

    2023-04-03
    161
  • 【数组、双指针】day5_76. 最小覆盖子串

    【数组、双指针】day5_76. 最小覆盖子串给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串

    2023-11-13
    135
  • [已解决] 如何在Java中逆转堆栈?示例教程

    [已解决] 如何在Java中逆转堆栈?示例教程大家好,如果你想知道如何在Java中还原一个堆栈,那么就不要乱跑。在这篇文章中,我将一步一步地告诉你 如何在Java中逆转一个给定的堆栈。有两种方法来逆转堆栈,你可以使用迭代 或递归。最常见的反转堆栈

    2023-11-16
    149
  • Spring事务和MySQL事务详解面试「终于解决」

    Spring事务和MySQL事务详解面试「终于解决」文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTEDSpring事务的隔离级别Spring

    2023-04-02
    157