热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java并发机制详解及其在数据安全性保障中的应用方案

《JAVA啃骨头》之 Java SE 章节java的并发机制及并发机制下数据安全问题的解决方案 说在前面:线程和进程 在提及多线程的时候,必须引入线程这个概念,而线程往往是和进程联系在一起的。线程和进


《JAVA啃骨头》之 Java SE 章节

java的并发机制及并发机制下数据安全问题的解决方案
  • 说在前面:线程和进程
    在提及多线程的时候,必须引入线程这个概念,而线程往往是和进程联系在一起的。线程和进程的关系,举一个例子,一家公司是一个进程,网景和京东是不同的两家公司,他们就是两个不同的进程,本质上来说,进程实际上指的是一个应用程序。而线程可以将其看做是刘强东和奶茶妹妹,他们是两个线程,在京东这个进程里面有两个线程。
    进程(网景)和进程(京东)之间的资源是不会共享的,而同一个进程下的线程之间是会共享一部分资源的,当然并不是全部的资源都会共享。(刘强东和奶茶妹妹是有一部分的秘密可以共享的,但是他们也有各自的小秘密。)

  • 并发机制及存在价值
    如果把一个火车站看做是一个进程的话,那么多条检票窗口就是不同的线程,检票窗口多,检票效率就高。多线程的存在也同样是为了提高效率。
    一个线程一个栈,多个栈并行,工作效率就高。

  • 对于单核的CPU来说,多线程的本质其实是单线程
    一个CPU就像一个大脑,一个大脑只能同时执行一个任务,对于多核的CPU来说,确实可以做到真正的并行,但对于单核CPU来说,一个时间只能同时进行一个任务,所以,对于单核的CPU来说,多线程其实本质上是单线程。
    那么问题来了,既然单核的CPU的多线程其实本质是单线程,我们为何还称之为多线程呢?再举个栗子,小明准备写作业,可他有两个作业要写,但是他不想一个写完了再写另外一个,所以他想了一个特别的方法,一个作业写一个字,之后再写另一个作业,也只写一个字,这样轮流写,最终,我们可以看做他的两个作业是同时写完的。我们可以把小明看做是一个CPU,同时只能写一个作业(一个线程),但是,由于他在两个作业之间来回切换(抢夺时间片,获得执行权),总的来看,其实就是实现了同时完成两个作业(多线程并发)。

  • 多线程的实现方式
    java已经将多线程实现了,我们只需要继承就行了。

    第一种方式:编写一个类,直接继承java.lang.Thread,重写run方法。

    // 定义线程类
    public class MyThread extends Thread{
    public void run(){

    }
    }
    // 创建线程对象
    MyThread t = new MyThread();
    // 启动线程。
    t.start();

    第二种方式:编写一个类,实现java.lang.Runnable接口,实现run方法。

    // 定义一个可运行的类
    public class MyRunnable implements Runnable {
    public void run(){

    }
    }
    // 创建线程对象
    Thread t = new Thread(new MyRunnable());
    // 启动线程
    t.start();

    注意:第二种方式实现了接口,比较常用,因为一个类实现了接口,它还可以去继承其它的类,更灵活。(java支持单继承,支持多实现)因此,在使用多线程的时候,常常采用第二种方式。

  • 多并发下数据安全问题
    如果两个线程同时对一个数据进行修改,在一个线程获取数据后,还未将修改的数据返回,而另一个线程在此时获取的数据,那么,就会出现数据安全问题。
    多线程并发的数据安全问题的存在有三个条件:存在对数据的修改、多线程、共享数据。

  • 多并发环境下追求数据安全
    首先需要明确,虽然我们追求高效率,但是,数据的安全永远是需要放在第一位的,因此,在两个需要作出选择的时候,我们要首选数据安全,也正因此,我们在具备上述三个条件的时候,就不能采取多线程机制,只能采取单线程机制(线程同步机制)。

  • 多并发环境下数据安全的解决方案
    java的数据存在于三种变量里:


属性位置位置个数是否满足上述三个条件是否存在线程安全问题
实例变量堆中1 个有可能
静态变量方法区1个有可能
局部变量多个不满足

以后,存储数据常常采用数据结构的方式进行存储数据。如果使用局部变量的话:建议使用:StringBuilder。因为局部变量不存在线程安全问题,选择StringBuilder。StringBuffer效率比较低。

ArrayList是非线程安全的。
Vector是线程安全的。
HashMap HashSet是非线程安全的。
Hashtable是线程安全的。

synchronized是一种锁机制,synchronized有三种写法:

第一种:同步代码块:灵活
synchronized(线程共享对象){
同步代码块;
}
第二种:在实例方法上使用synchronized
表示共享对象一定是this
并且同步代码块是整个方法体。

第三种:在静态方法上使用synchronized
表示找类锁。
类锁永远只有1把。
就算创建了100个对象,那类锁也只有一把。

对象锁:1个对象1把锁,100个对象100把锁。
类锁:100个对象,也可能只是1把类锁。

我们以后开发中应该怎么解决线程安全问题?是一上来就选择线程同步synchronize吗?不是,synchronized会让程序的执行效率降低,用户体验不好。系统的用户吞吐量降低。用户体验差。在不得已的情况下再选择线程同步机制。

第一种方案:尽量使用局部变量代替“实例变量和静态变量”。
第二种方案:如果必须是实例变量,那么可以考虑创建多个对象,这样
实例变量的内存就不共享了。(一个线程对应1个对象,100个线程对应100个对象,
对象不共享,就没有数据安全问题了。)
第三种方案:如果不能使用局部变量,对象也不能创建多个,这个时候
就只能选择synchronized了。线程同步机制。

  • 多并发的使用场景
    多并发也叫做高并发,高并发的应用场景有很多,比如:12306的秒杀、淘宝双十一的抢购。对于不同的并发量,可以有不同的解决方案…


推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细探讨了Java中Volatile关键字的工作原理、优化技巧及其在实际开发中的应用场景,特别是在提高多线程环境下数据可见性和减少锁竞争方面的优势。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • 使用PHP实现网站访客计数器的完整指南
    本文详细介绍了如何利用PHP构建一个简易的网站访客统计系统。通过具体的代码示例和详细的解释,帮助开发者理解和实现这一功能,适用于初学者和有一定经验的开发人员。 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
author-avatar
宁艺汉先生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有