iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java线程安全与同步实例分析
  • 140
分享到

Java线程安全与同步实例分析

2023-06-30 02:06:22 140人浏览 安东尼
摘要

本篇内容介绍了“Java线程安全与同步实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程安全问题多个线程可能会共享(访问)同一个资源

本篇内容介绍了“Java线程安全与同步实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

线程安全问题

多个线程可能会共享(访问)同一个资源

比如访问同一个对象,同一个变量,同一个文件

当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题,称为线程安全问题

什么情况下会出现线程安全问题

多个线程共享同一个资源

且至少有一个线程正在执行写的操作

实例:

存钱取钱问题

分别有存钱和取钱2个线程

   存钱                      取钱
   线程1         余额         线程2
   1000  《----1000------》 1000
   1000+1000-----》2000
                500 《-----1000-500

正确:结束后余额应该是1500,而不是500

买票问题

有卖票2个线程

   卖票                      卖票
   线程1         票数         线程2
   1000  《----1000------》 1000
   1000-1-----》999
                999 《-----1000-1

正确:结束后余额应该是998,而不是999

买票问题错误(未线程同步)实例:

public class love implements Runnable{    private int piao=3000;//有3000张票    public boolean sale() {//ture代表还有票;false代表没有票了        if(piao<1) return false;         piao--;//卖1张票                  //细化piao--;         //寄存器=piao;         //寄存器=寄存器-1;         //piao=寄存器;                  String sk =Thread.currentThread().getName();//获取当前线程(买票窗口)的名字         System.out.println(sk+"卖了1张票,还剩下"+piao+"张");         return piao>1;    }    public void run() {         while(sale());//循环执行;直至卖完票返回false    }} public class Main {    public static void main(String[] a) {        love tjlove =new love();        for(int i=1;i<=4;i++) {//循环4次;产生4个线程(窗口)卖票            Thread tj = new Thread(tjlove());            tj.setName(""+i);            tj.start();        }    }}

部分输出结果:

Java线程安全与同步实例分析

线程安全问题

分析问题

线程A和B对类中1个变量值为17进行+1操作
最终结果为2个18

解决方案

过程:首先线程A先访问到这个17,读上来后进行加锁并进去+1的操作改为18
并且17在加锁期间其它线程都不能访问
改完之后再进行写入,然后再解锁17
然后再由线程B去访问它,再进行加锁,重复上面操作变成19再解锁
这样做能保证在同一时间只有1个线程去访问它,这样就保证了安全;之前错误是由于这些线程一起去访问了它

线程同步

刚刚所说的加锁操作便是线程同步技术

可以使用线程同步技术来解决线程安全问题

线程同步在Java里有2种做法:

同步语句

同步方法

同步语句

public class love implements Runnable{private int piao=3000;//本人cpu单核性能过强,数据量大些才能看到是4个线程在卖票public boolean sale() {synchronized(this) {//1个线程获取这个对象的锁,并加锁;    synchronized作用于整个语句//this指向当前对象//不能用new Object();这样会产生新的对象,产生新的锁//把this换成"123",效果基本一样;因为其存在常量值里,每次访问的对象一样if(piao<1) return false;piao--;String sk =Thread.currentThread().getName();System.out.println(sk+"卖了1张票,还剩下"+piao+"张");return piao>0;}}public void run() { while(sale());}}

部分输出结果:

Java线程安全与同步实例分析

synchronize(obj)的原理

每个对象都有一个与它相关的内部锁(intrinsic lock)或者叫监视器锁(monitor lock)

第一个执行到同步语句的线程可以获得 obj 的内部锁,在执行完同步语句中的代码后释放此锁

只要一个线程持有了内部锁,那么其它线程在同一时刻将无法再获得此锁

✓ 当它们试图获取此锁时,将会进入BLOCKED状态

多个线程访问同一个 synchronized(obj)语句时

obj必须是同一个对象,才能起到同步的作用

同步方法

public class love implements Runnable{    private int piao=3000;    public synchronized boolean sale() { //synchronized作用于整个方法            if(piao<1) return false;            piao--;            String sk =Thread.currentThread().getName();            System.out.println(sk+"卖了1张票,还剩下"+piao+"张");            return piao>0;    }    public void run() {         while(sale());    }}

synchronized不能修饰构造方法

同步方法的本质

实例方法:synchronized (this)

静态方法:synchronized (Class对象)

同步语句比同步方法更灵活一点

同步语句可以精确控制需要加锁的代码范围,减少处于BLOCKED状态的线程,充分利用劳动力

使用了线程同步技术后

虽然解决了线程安全问题,但是降低了程序的执行效率

因为加了锁就会有处于等待的线程,多了加锁解锁的操作

所以在真正有必要的时候,才使用线程同步技术

“Java线程安全与同步实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java线程安全与同步实例分析

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java线程安全与同步实例分析
    本篇内容介绍了“Java线程安全与同步实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程安全问题多个线程可能会共享(访问)同一个资源...
    99+
    2023-06-30
  • Java线程安全与不安全实例分析
    本篇内容主要讲解“Java线程安全与不安全实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程安全与不安全实例分析”吧!当我们查看JDK API的时候,总会发现一些类说明写着,线程...
    99+
    2023-06-17
  • Java线程同步问题实例分析
    这篇文章主要讲解了“Java线程同步问题实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程同步问题实例分析”吧!1.场景有五位沉默的哲学家围坐在一张圆桌旁,他们一生都在吃东西...
    99+
    2023-06-29
  • Java详细讲解线程安全与同步附实例与注释
    目录线程安全问题实例:存钱取钱问题买票问题线程安全问题分析问题解决方案线程同步同步语句synchronize(obj)的原理同步方法同步方法的本质线程安全问题 多个线程可能会共享(访...
    99+
    2024-04-02
  • Java线程之安全与不安全的示例分析
    这篇文章将为大家详细讲解有关Java线程之安全与不安全的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说Stri...
    99+
    2023-05-30
    java
  • Python线程安全实例分析
    这篇文章主要介绍“Python线程安全实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python线程安全实例分析”文章能帮助大家解决问题。一、什么是线程安全?线程安全,名字就非常直接,在多线...
    99+
    2023-06-29
  • C++多线程中的线程同步与互斥量实例分析
    本篇内容介绍了“C++多线程中的线程同步与互斥量实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程同步#include &...
    99+
    2023-06-30
  • 一文搞懂Java中的线程安全与线程同步
    目录1.为什么需要线程同步线程安全问题2.怎么实现线程同步2.1.使用volatile关键字2.2.使用synchronized关键字1.为什么需要线程同步 什么是线程安全:指在被多...
    99+
    2024-04-02
  • Java线程中的安全策略实例分析
    这篇文章主要介绍“Java线程中的安全策略实例分析”,在日常操作中,相信很多人在Java线程中的安全策略实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程中的安全策略实例分析”的疑惑有所帮助!...
    99+
    2023-06-30
  • Java 同步工具与组合类的线程安全性解析
    目录何为线程安全的类?基于条件的同步策略状态发布与所有权实例封闭正确地拓展同步策略同步容器复合操作不受同步容器保护同步容器的迭代问题警惕隐含迭代的操作并发容器ConcurrentHa...
    99+
    2024-04-02
  • Java线程同步问题分析
    本篇内容主要讲解“Java线程同步问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程同步问题分析”吧!Java线程同步的基本实现思路还是比较容易理解的。我们可以给共享资源加一把锁...
    99+
    2023-06-17
  • Java线程安全与非线程安全解析
    ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线...
    99+
    2023-05-31
    java 线程安全 ava
  • Java多线程同步问题的示例分析
    这篇文章主要介绍Java多线程同步问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!简单了解下在操作系统中进程和线程的区别:  进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开...
    99+
    2023-05-30
    java
  • Java多线程 - 线程安全和线程同步解决线程安全问题
    文章目录 线程安全问题线程同步方式一: 同步代码块方式二: 同步方法方式三: Lock锁 线程安全问题 线程安全问题指的是: 多个线程同时操作同一个共享资源的时候可能会出现业务安全问题,称为线程安全问题。 举例:...
    99+
    2023-08-20
    java 安全 jvm
  • java中stringbuffer线程安全分析的示例
    这篇文章主要介绍java中stringbuffer线程安全分析的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • Java线程安全状态的示例分析
    这篇文章主要为大家展示了“Java线程安全状态的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java线程安全状态的示例分析”这篇文章吧。一、观察线程的所有状态线程的状态是一个枚举类型 ...
    99+
    2023-06-29
  • java中线程安全问题举例分析
    这篇文章主要讲解了“java中线程安全问题举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中线程安全问题举例分析”吧!一、什么时候数据在多线程并发的环境下会存在安全问题?三个条...
    99+
    2023-06-21
  • Java并发编程:同步机制与线程安全探究
    在现代软件开发中,多线程编程已经成为了必不可少的一部分。在Java中,线程的使用非常方便,但是也带来了一些问题,比如线程安全问题。为了解决这些问题,Java提供了一些同步机制。在本文中,我们将探究Java中的同步机制和线程安全。 一、线程...
    99+
    2023-11-09
    同步 numy 日志
  • C#多线程中线程同步的示例分析
    这篇文章将为大家详细讲解有关C#多线程中线程同步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言我们先来看下面一个例子:using System;using Syste...
    99+
    2023-06-29
  • Java多线程中线程安全问题的示例分析
    这篇文章主要介绍了Java多线程中线程安全问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 什么是线程安全和线程不安全?什么是线程安全呢?当多个线程并发访问某...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作