青岛网站建设博采网络深圳制作公司网站的公司
news/
2025/9/23 3:21:52/
文章来源:
青岛网站建设博采网络,深圳制作公司网站的公司,上海企业网络推广价格,使用最佳搜索引擎优化工具1#xff1a;transient 当对象被序列化时#xff0c;transient阻止其修饰的对象进行序列化#xff1b;当反序列化时#xff0c;此对象的值不会被恢复。 2#xff1a;instanceof 判断引用指向的对象#xff0c;是不是某个类及其子类的实例对象#xff1b;
class Person …1transient 当对象被序列化时transient阻止其修饰的对象进行序列化当反序列化时此对象的值不会被恢复。 2instanceof 判断引用指向的对象是不是某个类及其子类的实例对象
class Person {}public class Man extends Person {public static void main(String[] args) {if(111 instanceof String) {System.out.println(所有字符串都是String类型);}Person man null;//尚未初始化指向的对象为null不是任何类的对象if(man instanceof Man) {System.out.println(man 是Man的对象);}if(man instanceof Person) {System.out.println(man 是Person的对象);}man new Man();//初始化之后if(man instanceof Man) {System.out.println(man 是Man的对象);}if(man instanceof Person) {System.out.println(man 是Person的对象);}}}输出如下
所有字符串都是String类型
man 是Man的对象
man 是Person的对象3volatile volatile是Java提供的轻量级的线程同步机制与之相对synchronized通常被称为重量级锁。 volatile有两个特性 保证共享变量对所有线程的可见性 禁止指令重排序优化 Java多线程内存模型简要描述如下 volatile保证可见性的方式为 当写一个共享变量时JMMJava Memory Model会把该线程对应的本地内存中的变量强制刷新到主内存中 这个写操作会导致其他线程的本地内存中的缓存无效
对于num这类的复合操作只使用volatile无法保证其原子性可以通过synchronized或其他的锁机制、CAS机制来保障参见后续文章
volatile禁止指令重排序 volatile修饰变量在编译时会在指令序列中插入内存屏障来禁止特定类型的处理器重排序 volatile禁止指令重排序的一些规则
当第二个操作是volatile写时无论第一个操作是什么都不能进行重排序当第一个操作是volatile读时无论第二个操作是什么都不能进行重排序当第一个操作是volatile写第二个操作是volatile读时不能进行重排序
3.1volatile拓展Java JMM的happens-before原则规则 《JSR-133:Java Memory Model and Thread Specification》对happens-before关系的定义如下
1.如果一个操作happens-before另一个操作那么第一个操作的执行结果将对第二个操作可见而且第一个操作的执行顺序排在第二个操作之前。
2.两个操作之间存在happens-before关系并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果与按happens-before关系来执行的结果一致那么这种重排序并不非法。
上面1是JMM对程序员的承诺。从程序员的角度来说可以这样理解happens-before关系如果A happens-before B那么Java内存模型将向程序员保证——A操作的结果将对B可见且A的执行顺序排在B之前。注意这只是Java内存模型向程序员做出的保证
上面2是JMM对编译器和处理器冲排序的约束。MM其实是在遵循一个基本原则只要不改变程序的执行结果编译器和处理器怎么优化都行。happens-before这么做的目的都是为了在不改变程序执行结果的前提下尽可能地提高程序执行的并行度。
三.happens-before规则
1.程序顺序规则一个线程中的每个操作happens-before于该线程中的任意后续操作
2.监视器锁规则对一个锁的解锁happens-before于随后对这个锁的加锁
3.volatile变量规则对一个volatile域的写happens-before于任意后续对这个volatile域的读
4.传递性如果A happens-before B且B happens-before C那么A happens-before C
5.start规则如果线程A执行操作ThreadB.start()启动线程B那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作
6.join规则如果线程A执行操作ThreadB.join()并成功返回那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。 参考链接https://www.cnblogs.com/chenssy/p/6393321.html
4synchronized
偷个懒放个链接PS这个博主写的真好 https://www.cnblogs.com/mingyao123/p/7424911.html 回头再回顾下多线程那本书
5final final总体表达不可变的语义final的四种用法
修饰数据包括成员变量和局部变量。该变量只能被赋值一次且它的值无法被改变。对于成员变量来说只能在声明处或者构造方法中赋值修饰方法参数表示这个参数在方法生命周期中不能被重新赋值修饰方法表示该方法无法被重写修饰类表示该类无法被继承
6static
修饰属性使其成为类属性此类的所有对象共享此属性修饰方法使其成为类方法调用时可直接使用类名.方法名来调用就不用再创建对象修饰代码块一般用于类成员的初始化静态引入(import static)通过静态引入的静态属性或静态方法可以直接用名称引用不用使用类名.的形式
7const const是Java中的预留关键字类似预留关键字还有goto。目前暂时没用。C语言中const类似final。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911222.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!