返回顶部
首页 > 资讯 > 精选 >java线程安全Synchronized关键字怎么使用
  • 124
分享到

java线程安全Synchronized关键字怎么使用

2023-06-04 04:06:21 124人浏览 安东尼
摘要

这篇文章主要介绍“java线程安全Synchronized关键字怎么使用”,在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jav

这篇文章主要介绍“java线程安全Synchronized关键字怎么使用”,在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java线程安全Synchronized关键字怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1 多线程下为什么会存在线程安全问题

线程的合理使用能够提升程序的处理性能,一是能够利用多核 CPU 来实现线程的并行执行,二是线程的异步化执行能够提高系统的吞吐量。

虽然线程有这些优点,但同时也带来了很多问题。比如说:

1 共享变量带来的安全性问题

先来看个图:

java线程安全Synchronized关键字怎么使用

一个变量 i ,如果线程 A 或者线程 B 单独访问并且修改变量 i 的值没有任何问题,那如果并行的修改变量 i ,那就会有安全性问题。

然后用代码来模拟一下这种场景,为了更好的看到效果,我用100个线程:

public class ThreadDemo1 {      private static int i = 0;      public static void inc() {         try {             Thread.sleep(1);         } catch (InterruptedException e) {             e.printStackTrace();         }         i++;     }      public static void main(String[] args) throws InterruptedException {         for (int i = 0; i < 100; i++) {             new Thread(() -> ThreadDemo1.inc()).start();         }         Thread.sleep(1000);         System.out.println("运行结果" + i);     } }

输出结果:

88

这个输出结果是不固定的,第一次可能是 88 ,第二次可能是 87 ,这个结果就和我们预期的结果不一致(预期结果是100),所以一个对象是否是线程安全的,取决于它是否会被多个线程访问,以及程序中是如何去使用这个对象的。如果 多个线程访问同一个共享对象,在不需额外的同步以及调用端代码不用做其他协调的情况下,这个共享对象的状态 依然是正确的(正确性意味着这个对象的结果与我们预期 规定的结果保持一致),那说明这个对象是线程安全的。

对于线程安全性,本质上是管理对于数据状态的访问,而且这个这个状态通常是共享的、可变的。共享:是指这个 数据变量可以被多个线程访问;可变:指这个变量的值在 它的生命周期内是可以改变的。

2.如何保证线程并行的数据安全性-Synchroinzed

针对上面那种情况,我们该如何解决这种问题呢?首先想到的就是加,并且这种锁必须是互斥的。比如上面的图片的例子,如果线程A在修改 i 的值时,线程 B 就不能去修改 i 的值。也就是说并行去修改共享变量的值会有线程安全性问题,那么我们不让你并行,不就解决了这个问题嘛。所以java提供了 Synchroinzed 关键字。

1 Synchroinzed 的基本认识

Synchroinzed 很早就有了,只是之前是重量级锁,所以很好有人使用。在 javaSE 1.6 对Synchroinzed进行了优化引入了偏向锁和轻量级锁。所以在并发量不高的情况还是推荐使用 Synchroinzed 来加锁。为什么是并发量不高的情况推荐使用,因为并发量高的情况 Synchroinzed 会升级为重量级锁。

2 Synchroinzed 的三种加锁方式

  1. 修饰实例方法,锁是当前实例对象 ,进入同步代码前要获得当前实例的锁

  2. 修饰静态方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁

  3. 修饰代码块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

  4. 加q群:478052716 免费领取(Java架构资料,视频资料,BATJ面试资料)

看下简单的代码

public class SynchroinzedDemo {           public static synchronized void test(){}          public synchronized void test1(){}          public void test2(){         synchronized(this){}     } }

然后我们将上面的例子实现 synchronized 加锁:

public class ThreadDemo1 {      private static int i = 0;      public static void inc() {         synchronized (ThreadDemo1.class){             try {                 Thread.sleep(1);             } catch (InterruptedException e) {                 e.printStackTrace();             }             i++;         }     }      public static void main(String[] args) throws InterruptedException {         for (int i = 0; i < 100; i++) {             new Thread(() -> ThreadDemo1.inc()).start();         }         Thread.sleep(1000);         System.out.println("运行结果" + i);     } }

运行结果:

运行结果100

完美的解决共享变量并行修改带来的线程安全问题。

到此,关于“java线程安全Synchronized关键字怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java线程安全Synchronized关键字怎么使用

本文链接: https://lsjlt.com/news/236464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java线程安全Synchronized关键字怎么使用
    这篇文章主要介绍“java线程安全Synchronized关键字怎么使用”,在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jav...
    99+
    2023-06-04
  • Java多线程之synchronized关键字的使用
    目录一、使用在非静态方法上二、使用在静态方法上三、使用在代码块上四、三种方式的区别4.1 不会互斥4.2 互斥一、使用在非静态方法上 public synchronized vo...
    99+
    2024-04-02
  • Java多线程synchronized关键字怎么输出
    这篇文章主要介绍“Java多线程synchronized关键字怎么输出”,在日常操作中,相信很多人在Java多线程synchronized关键字怎么输出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java多...
    99+
    2023-06-17
  • Java多线程并发synchronized 关键字
    目录基础修饰普通方法修饰静态方法Synchronized 加锁原理monitorentermonitorexitsynchronized 修饰静态方法优点、缺点及优化其他说明基础 J...
    99+
    2024-04-02
  • Java多线程并发编程 Synchronized关键字
    synchronized 关键字解析同步锁依赖于对象,每个对象都有一个同步锁。现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test ...
    99+
    2023-05-31
    java synchronized 关键字
  • Java中的synchronized关键字怎么用
    小编给大家分享一下Java中的synchronized关键字怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、synchronized锁的底层实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。...
    99+
    2023-06-25
  • synchronized关键字的使用
    synchronized关键字是java并发编程中常使用的同步锁,用于锁住方法或者代码块,锁代码块时可以是synchronized(this){}、synchronized(Object){}、synchronized(类class){}。...
    99+
    2019-02-24
    java教程 synchronized
  • 如何在Java中使用synchronized关键字
    如何在Java中使用synchronized关键字?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类...
    99+
    2023-06-14
  • Objective-C中的@Synchronized关键字怎么使用
    这篇文章主要介绍“Objective-C中的@Synchronized关键字怎么使用”,在日常操作中,相信很多人在Objective-C中的@Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-05
  • Java中关键字synchronized的使用方法详解
    synchronized是Java里的一个关键字,起到的一个效果是“监视器锁”~~,它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性! public clas...
    99+
    2024-04-02
  • 怎样深入理解Java多线程与并发框中的synchronized 关键字
    怎样深入理解Java多线程与并发框中的synchronized 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Class文件与对象对象头 32位JVM的对象头二、sy...
    99+
    2023-06-05
  • 浅析Java关键词synchronized的使用
    目录1 引入Synchronized2 Synchronized的使用2.1 对象锁2.2 类锁3 Synchronized原理分析3.1 虚拟机如何辨别和处理synchronize...
    99+
    2022-12-30
    Java关键词synchronized Java synchronized
  • Java中线程状态+线程安全问题+synchronized的用法是什么
    这篇文章主要介绍了Java中线程状态+线程安全问题+synchronized的用法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中线程状态+线程安全问题+synchronized的用法是什么文章都...
    99+
    2023-06-29
  • Java中怎么利用synchronized关键字实现同步机制
    Java中怎么利用synchronized关键字实现同步机制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的synchronized使用方法总结1.  把sy...
    99+
    2023-06-18
  • Java中线程状态+线程安全问题+synchronized的用法详解
    目录java中的线程状态线程安全问题案例分析多线程对同一变量进行写操作内存可见性问题指令重排序问题synchronized的用法synchronized起作用的本质修饰普通方法修饰静...
    99+
    2024-04-02
  • 如何在Java编程中使用同步关键字保证算法的线程安全性?
    Java是一种面向对象的编程语言,它被广泛应用于企业级应用程序的开发。在Java编程中,线程安全性是一个非常重要的问题。线程安全性是指在多线程环境下,程序的正确性和可靠性能够得到保证。在Java编程中,同步关键字是保证算法线程安全性的一种常...
    99+
    2023-11-11
    编程算法 同步 关键字
  • Java super关键字怎么使用
    本文小编为大家详细介绍“Java super关键字怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java super关键字怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.s...
    99+
    2023-07-02
  • java instance关键字怎么使用
    在Java中,关键字"instance"用于判断一个对象是否属于特定的类或其子类的实例。它用于实现类型检查和类型转换。以下是"ins...
    99+
    2023-10-20
    java
  • java final关键字怎么使用
    这篇文章主要介绍“java final关键字怎么使用”,在日常操作中,相信很多人在java final关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java final关键字怎么使用”的疑惑有所...
    99+
    2023-07-04
  • Java中 transient关键字怎么使用
    本篇文章为大家展示了Java中 transient关键字怎么使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizabl...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作