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

java关键词Transient、native、volatile

Transient是出现在mybatis映射实体类的时候,实体类某属性不需要映射的数据库表字段的时候加上transient标签。主要的作用是对象序列化的时候会忽略这个

Transient是出现在mybatis映射实体类的时候,实体类某属性不需要映射的数据库表字段的时候加上@transient标签。主要的作用是对象序列化的时候会忽略这个属性。

native在看法的过程没有使用过,在看源码的时候经常看到过用它来修饰一些方法。主要的作用在方法前加上native,代表方法是通过外部底层C实现的,调用的时候会用调用C语言方法调用。

volatile使用是在多线程开发的时候,有共享变量,使用它来就行修饰变量,注意它不能保证变量的原子性。对于读操作时:该变量拿到的一直是主内存的(最新值),主要是在多线程共享变量中,某一个线程更改变量,另一个线程有可能会从缓存中读取(优化的问题),用它可以保证变量的可见性;对于写操作时:将当前处理器缓存行的数据写回到系统内存, 这个写回内存的操作会使得在其他处理器缓存了该内存地址无效。

为什么volatile不能保持原子性:当两个线程同时操作自增的时候,取值、加值、改变内存值,由于取值跟加值都是同一个时间点,两者都还未提交修改值,内存值没有失效,然后同时提交。

 

添加一段代码验证volatile的可见性:

public class Test implements Runnable {/*** 内部类实现static*/static class ObjectA {private boolean flag = true;}/*** 尝试不用volatile修饰变量和用volatile修饰变量的区别*/private volatile ObjectA a;/*** 构造函数* @param a*/public Test(ObjectA a) {this.a = a;}/*** 实现线程run*/@Overridepublic void run() {while (a.flag) {//不做任何操作,或者极短的操作时间}}/*** 改变变量a的值,让线程停止的功能*/public void stop() {a.flag = false;}public static void main(String[] args) throws InterruptedException {//启动线程Test test = new Test(new ObjectA());Thread t = new Thread(test);t.start();//跑一段时间Thread.sleep(1000);//停止线程test.stop();//等待子线程停止t.join();}}

整个代码逻辑是启动一个线程,运行1秒,关闭它,当我们用volatile修饰a变量的时候,代码是没问题的,当变量改变的时候,线程马上停止;如果不用volatile修饰变量a,会发现线程一直在运行,a变量明明改变值了,但是run获取到的值一直是旧的值。


推荐阅读
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在本文中,我们探讨了如何使用 NSArrays 来实现集合的交集与并集操作。通过两个示例数组 A 和 B,其中包含一些共同元素(例如 A: 1, 2, 3 和 B: 2, 3, 4),我们将详细介绍如何高效地进行这些集合操作。此外,我们还将讨论这些方法在实际应用中的性能优势和适用场景。 ... [详细]
  • 优化后的标题:深入解析09版Jedis客户端
    深入解析09版Jedis客户端,本文将详细介绍如何在Java项目中正确配置Jedis以操作Redis。首先,确保项目的JDK版本和编译器设置正确。接着,通过Maven或Gradle导入必要的依赖项,如 `redis.clients:jedis`。此外,文章还将探讨Jedis连接池的配置与优化,以及常见问题的解决方案,帮助开发者高效使用Jedis进行Redis操作。 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • JDK 1.8引入了多项并发新特性,显著提升了编程效率。本文重点探讨了LongAdder和StampedLock的特性和应用场景。此外,还介绍了在多线程环境中发生死锁时,如何通过jps命令进行诊断和排查,提供了详细的步骤和示例。这些改进不仅增强了系统的性能,还简化了开发者的调试工作。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Java 中 ZonedDateTime 类的天数方法详解及示例代码 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • Java SE 文件操作类详解与应用
    ### Java SE 文件操作类详解与应用#### 1. File 类##### 1.1 File 类概述File 类是 Java SE 中用于表示文件和目录路径名的对象。它提供了丰富的方法来操作文件和目录,包括创建、删除、重命名文件,以及获取文件属性和信息。通过 File 类,开发者可以轻松地进行文件系统操作,如检查文件是否存在、读取文件内容、列出目录下的文件等。此外,File 类还支持跨平台操作,确保在不同操作系统中的一致性。 ... [详细]
  • 在Java中,`Timer`类主要用于在指定时间或以固定周期执行任务。虽然它具备线程安全性,但并不保证实时性。此外,`Timer`支持使用守护线程来运行任务,Java中的线程分为用户线程和守护线程两种类型。用户线程通常用于执行应用程序的主要逻辑,而守护线程则用于支持程序的后台操作。通过合理配置`Timer`,可以实现高效的任务调度和管理。 ... [详细]
  • 在Java编程中,若需实现两个整数(例如2和3)相除并保留两位小数的结果,可以通过精确计算方法来达到预期效果。具体而言,可以利用BigDecimal类进行高精度运算,确保2除以3的结果准确显示为0.66。此外,还可以通过格式化输出来控制小数位数,确保最终结果符合要求。 ... [详细]
  • Eclipse JFace Text框架中IDocument接口的getNumberOfLines方法详解与编程实例 ... [详细]
  • 在C#中开发多线程应用程序变得高效且简便,与之前使用VB时的复杂性和局限性形成鲜明对比。C#不仅提供了丰富的多线程编程模型,还简化了线程管理、同步和通信等关键任务,使得开发者能够更加轻松地构建高性能的应用程序。此外,C#的异步编程特性进一步增强了多线程应用的开发效率和可维护性。 ... [详细]
author-avatar
高档的干果ieb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有