本文作者:ptiyny

java语言执行顺序 java语句执行顺序

ptiyny 06-07 21
java语言执行顺序 java语句执行顺序摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于java语言执行顺序的问题,于是小编就整理了4个相关介绍java语言执行顺序的解答,让我们一起看看吧。string long i...

大家好,今天小编关注到一个比较意思的话题,就是关于java语言执行顺序问题,于是小编就整理了4个相关介绍Java语言执行顺序的解答,让我们一起看看吧。

java语言执行顺序 java语句执行顺序
图片来源网络,侵删)
  1. string long int方法中参数前后顺序?
  2. 在使用多线程和连接池的情况下如何保证SQL执行顺序?
  3. Java如何解决可见性和有序性的问题?
  4. 在java中类的初始化和对象的实例化有哪些区别,是先执行哪一步?

string long int方法参数前后顺序?

拿java语言来举个例子,在java的方法中的参数类型,是没有前后顺序的概念,只要定义了就可以在方法中任意调用

在其他语言中,也是一样的,定义方法中参数类型是没有前后顺序的哦,比较随意,看个人习惯

使用线程连接池的情况下如何保证SQL执行顺序?

谢谢邀请!

这个问题用同步门闩应该可以解决,我们看一下定义:

java语言执行顺序 java语句执行顺序
(图片来源网络,侵删)
CountDownLatch是jdk1.5之后引入的一个同步器应用类,它的作用能够使一个线程一直等待直到其他线程完成任务后再继续执行。CountDownLatch通常也被叫做门闩,意思是它会导致一条或多条线程一直在门口等待,直到一条线程打开这个门,其他线程才得以继续执行

这是jdk1.5新增加的功能,另外使用同步屏障应该也能解决。

我在头条上写了系列学习java并发的文章,里面有演示代码,关注我就可以看到了。

再次感谢邀请!

Java如何解决可见性和有序性的问题?

线程安全有三大特性:原子性,可见性,有序性,只有三大特性都满足的时候才能保证线程安全,三大特性详细描述如下:

java语言执行顺序 java语句执行顺序
(图片来源网络,侵删)

1,原子性:通常是指代码执行的效果,要么全部执行成功,要么全部失败;

2,可见性:线程中的本地内存中的变量值,应该立即同步到主内存中,让其他线程可见;

3,有序性:保证代码执行的串行性;

java中的原子性操作主要是使用sun.misc.Unsafe包下的compareAndSwap方法实现,这是sun包下native方法,使用c++代码实现,在CPU层级来 保证底层指令的原子性,或者使用加锁的方式

但是CAS也会存在问题,具体参见我的另一个回答,这不做 详细讨论!

可见性无法保证主要是因为,内存的存取速度跟CPU相比存在差距,所以在CPU和主内存之间,引入了缓存(线程本地内存)的概念,来增加CPU 的计算性能,副作用就是导致线程操作共享数据时,无法保证中间数据是最新的(有可能还在别的线程的本地内存汇总)

有序性无法保证是因为基于性能的考虑,编译器处理器会对操作指令进行排序,在单线程之中不存在问题,但如果多线程就可能存在 判断错误的情况!

编译器的重排序也是规则的,java中先天的有序性组成了happens-before原则,如果happens-before原则不能推导出指令的执行次序,则指令 就不是有序的,happens-before八大原则为:程序次序规则(单线程中的顺序性,多线程无法保证),锁定规则(同一个锁先解锁,后加锁) ,volatile变量规则(先写后读),传递规则(类似A早于B,B早于C,则A早于C),线程启动原则(start方法是线程最先执行的方法),线程 中断规则,线程终结规则,对象终结规则!happens-before八大原则规定了指令执行的有序性

首先需要了解,为什么会有「可见性」和「时序性」问题,然后我们来看Java是如何解决这两个问题的。

导致「可见性」和「时序性」问题的原因有如下几个:

抢占式任务执行:现代CPU执行多任务方式是「抢占式」,它的总控制权在操作系统手中,操作系统会轮流给需要CPU执行的任务分配执行时间片,超过时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在队列的最后,最后分配时间片……

存储速度差异:各存储执行速度的不同,离CPU越近,存储速度越快,相对的容量就越小。执行程序所需要的数据不可能一次性全部都加载到寄存器中,所以有load与store的过程,影响了所谓的「可见性」

指令重排:大多数现代微处理器都会采用将指令乱序执行(out-of-order execution,简称OoOE或OOE)的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待。通过乱序执行的技术,处理器可以大大提高执行效率。除了处理器,常见的Java运行时环境的JIT编译器也会做指令重排序操作,即生成机器指令与码指令顺序不一致。

解决思路很简单,就是把多线程强制单线程执行。

解决方法无非两种:

内存屏障

先看下JVM的内存模型,我们基于这个模型来简单说明下

在java中类的初始化和对象的实例化有哪些区别,是先执行哪一步?

Java规范中说明了一个对象在可以被使用之前必须要被正确地初始化,所以是先执行类的初始化,然后才会又对象的实例化。如果有什么区别的话,那就是实例化要在初始化之后。

类的初始化

当Java虚拟机开始工作的时候,会首先对需要的类进行加载,这个加载的过程中又类加载器负责,加载过程分为五个阶段,加载、验证、准备、解析和初始化,

对象的实例化

当类被初始化之后,我们才能获取对象的实例,比如说执行到new Person()这一步的时候,先为成员变量赋默认的初始值,然后再按照成员变量以及非静态块的出现顺序进行初始化,等所有成员变量初始化完成以及非静态块执行完之后调用构造方法完成对象的创建,这个过程就是对象的实例化。

希望我的回答对你有所帮助

到此,以上就是小编对于java语言执行顺序的问题就介绍到这了,希望介绍关于java语言执行顺序的4点解答对大家有用。

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享