首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java一个死锁

此时如果把sleep()换成wait()会出现 线程1锁o1 Exception in thread "Thread-0" 线程2锁o2 线程2锁o1 java.lang.IllegalMonitorStateException...查看API发现 java.lang.IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程...Java中用到的线程调度算法是抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。...由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作...Semaphore有一个构造函数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。

2K20
您找到你想要的搜索结果了吗?
是的
没有找到

Java虚拟机:我们java代码究竟是如何运行起来的

点击上方蓝字关注我,让我成为你的专属小太阳 首先假设咱们写好了一份Java代码,那这份Java代码中,是不是会包含很多的“.java”为后缀的代码文件?...比如User.java,OrderService.java,CustomerService.java 平时在Eclipse、Intellij Idea等开发工具中,就有很多类似这样的Java源代码文件。...实际上这里有一个非常关键的步骤,就是“编译” 也就是说,在我们写好的“.java”代码打包的过程中,一般就会把代码编译成“.class”后缀的字节码文件,比如 User.class,Hello.class...接着就要思考下一个问题: 对于编译好的这些 .class 字节码,是怎么让他们运行起来的呢?...这个时候就需要诸如 java -jar 之类的命令来运行我们写好的代码了 此时一旦你采用 java 命令,实际上此时就会启动一个JVM进程 这个 JVM 就会来负责运行这些 .class 字节码文件,也就相当于是负责预先我们写好的系统

78430

java虚拟机如何加载一个

除了启动类加载器外,还有其他类加载器,且都是java.lang.ClassLoader的子类,这个类加载器需要另外一个加载器加载到java虚拟机,比如启动类加载器,才能执行类加载器 此时我们以建筑师来说...,假设他有一个规则,就是不能独自接活,必须由他们的师傅过目,如果师傅看不上的或才能交给他们进行处理,正如我们的Java虚拟机一样,每当一个类加载器接受到加载请求时候,他会先将请求转发给父类加载器,在父类加载器没有找到所请求的类的情况下...链接 链接的是指创建的类合并至java虚拟机,使他能够执行,他也分为三个步骤,验证,准备,解析 验证的目的就是确保被加载类能够满足java虚拟机的约束条件,正如我们盖房子,设计的房子要交给市政部分审核,...此时就算改好了毛坯房 在class文件被加载到java虚拟机之前,这个类无法知道其他类及其方法,字段以及具体地址,甚至自己的方法,字段的资质,因此在每当需要应用这些成员时候,java编译器会生成一个符号引用...Java编译器标记成常量值,其初始化直接由java虚拟机完成,除此之外的情况以及所有静态代码块的代码块,则会被java编译器放到同一个方法中,并命名为clinit 初始化是类加载的最后一步,便是标记常量字段复制

30930

Java虚拟机--Java发展史Java虚拟机

Java虚拟机 从今开始,笔者开始向大家讲解JAVA虚拟机的知识,有没有很兴奋!!!! 对于JAVA开发者来说,虚拟机再熟悉不过,每天的工作中都会接触,但是总有一种“近在眼前,却又远在天边”的感觉。...既然学习虚拟机,那么关于Java的相关历史还是有必要去了解的,在本章节中,笔者将会先介绍Java的发展历史,再说说Java虚拟机的发展历史! 接下里,就让我们开始第一章节的学习吧。...因此,Sun在1996 年1月23日发布了JDK1.0,提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM)。...在JDK1.0版本中,主要技术包括:Java虚拟机、AWT等。...在Java1.2这个版本中,Java虚拟机第一次内置了JIT(Just In Time)编译器,之前版本的Sun Classic VM虚拟机只能以外挂的形式使用JIT编译器。

1.5K70

JAVA一个冒泡排序「建议收藏」

private static int [] a={12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; 5 static int temp=0;//一个临时存放点...相邻的两个数依次进行比较,如果先改变正序或反序,可以改变大小于 10 temp=a[j]; 11 a[j]=a[i];//在三行进行一个值的移动替换...System.out.println(a[i]); 18 } 19 } 20 } 冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值...如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数...,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量;   缺点:效率不高 (如果一个数组有n个数,那么排序完成后需要比较n*(n-1)/2次); 欢迎大家一起说出自己的想法

48420

Java虚拟机--虚拟机内存区域Java虚拟机内存区域

Java虚拟机内存区域 Java程序在JVM虚拟机中运行,当我们一个类被加载到虚拟机中时,JVM会给该类分配具体的内存空间/内存地址,而这被分配的区域就是Java虚拟机运行时内存区域。...首先,我们先简单一个Java程序,代码如下: public class Test { public void test(){ int x = 1; int y...每当Java程序启动一个新的线程时,Java虚拟机会为该线程分配一个栈空间,Java虚拟机栈以栈帧为单位保持线程运行状态,每当线程调用一个方法时候就会向线程栈里面压入一个栈帧,只要这个方法还没返回,这个栈帧就存在...字符串常量池 说直白点,就是存放我们程序中的字符串 在Java1.6中,字符串常量池存放在方法区中;在Java1.7后,字符串常量池存放在了Java虚拟机堆中。 为什么要设计字符串常量池呢?...在Java虚拟机中,字符串常量池的实现基于一个String Table,它是一个hash表结构,默认长度是1009。该Table是整个Java虚拟机所共享的,每一个字符串都会放到该表中。

2K80

Java虚拟机

简述虚拟机Java 虚拟机栈用来描述 Java 方法执行的内存模型。线程创建时就会分配一个栈空间,线程结束后栈空间被回收。...栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧「存储方法的局部变量表、操作栈、动态链接和返回地址等信息」。...简述本地方法栈 本地方法栈与虚拟机栈作用相似,不同的是虚拟机栈为虚拟机执行 Java 方法服务,本地方法栈为本地方法服务。...简述java创建对象的过程 检查该指令的参数能否在常量池中定位到一个类的符号引用,并检查引用代表的类是否已被加载、解析和初始化,如果没有就先执行类加载。 通过检查通过后虚拟机将为新生对象分配内存。...空闲列表: 对于 Java 堆内存不规整的情况,虚拟机必须维护一个列表记录哪些内存可用,在分配时从列表中找到一块足够大的空间划分给对象并更新列表记录。

88500

java怎么函数_java构造函数怎么

java构造函数怎么 发布时间:2020-06-29 11:50:19 来源:亿速云 阅读:114 作者:Leah java构造函数怎么?...构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化 一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。...一个类当中可以有多个是可以给不同的对象进行不同的初始化,多个构造函数在一个类中出现他们的存在的形式就是叫做重载。 重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同 也可以不同。...被重载的方法必须形参列表不一样,参数个数或类型不一样,重载方法能够在同一个类中或者在一个子类中被重载 一般函数和构造函数的区别: 构造函数在创建对象时,就会调用与之对应的构造函数,对象进行初始化。...对象创建后,一般函数可以被调用多次,一般函数的命名首字母是小写的 关于java构造函数怎么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识

4.3K20

Java虚拟机

主要目的 是确保解析行为能正常执行,如果无法通过符号引用验证,Java虚拟机将会抛出一个java.lang.IncompatibleClassChangeError的子类异常 验证阶段对于虚拟机的类加载机制来说...因此在Java虚拟机中第一个被执行的()方法的类型肯定是java.lang.Object。...Java虚拟机必须保证一个类的()方法在多线程环境中被正确地加锁同步 同一个类加载器下,一个类型只会被初始化一次 四、类加载器 类加载阶段 :通过一个类的全限定名来获取描述该类的二进制字节...类与类加载器 对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。...这句话可以表达得更通俗一些: 比较两个类是否“相等” ,只有在这两个类是 由同一个类加载器加载的前提下 才有意义,否则,即使这两个类来源于同一个 Class文件,被同一个Java虚拟机加载, 只要加载它们的类加载器不同

62620

Java虚拟机

1、Java虚拟机是什么 “Java虚拟机“可以指三种不同的东西 抽象规范 一个具体的实现 一个运行中的虚拟机实例 当运行一个Java程序的同时,也就是在运行一个Java虚拟机实例 2、Java虚拟机的生命周期...当启动一个Java程序时,一个虚拟机实例也就诞生了,当该程序关闭退出时,这个虚拟机实例也就随之消亡。...一个虚拟机实例的行为是分别按照子系统、内存区、数据类型以及指令这几个术语来描述的。 3.1、数据类型 ? Java语言中所有的基本类型同样也都是Java虚拟机中的基本类型。...3.6Java栈 每当启动一个线程时,Java虚拟机都会为它分配一个Java栈,Java栈也帧为单位保存线程的运行状态,虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。...每当线程调用一个方法时,虚拟机都会在该线程的Java栈中压入一个新帧,而这个新栈自然就成为当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等数据。

1.2K100

java虚拟机

Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。...从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。...正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。...因此虚拟机中第一个执行 () 方法的类肯定为 java.lang.Object。 由于父类的 () 方法先执行,也就意味着父类中定义的静态语句块的执行要优先于子类。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle

80720

Java虚拟机

主要目的 是确保解析行为能正常执行,如果无法通过符号引用验证,Java虚拟机将会抛出一个java.lang.IncompatibleClassChangeError的子类异常 验证阶段对于虚拟机的类加载机制来说...因此在Java虚拟机中第一个被执行的()方法的类型肯定是java.lang.Object。...Java虚拟机必须保证一个类的()方法在多线程环境中被正确地加锁同步 同一个类加载器下,一个类型只会被初始化一次 四、类加载器 类加载阶段 :通过一个类的全限定名来获取描述该类的二进制字节...类与类加载器 对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。...这句话可以表达得更通俗一些: 比较两个类是否“相等” ,只有在这两个类是 由同一个类加载器加载的前提下 才有意义,否则,即使这两个类来源于同一个 Class文件,被同一个Java虚拟机加载, 只要加载它们的类加载器不同

70200

java一个音乐播放程序,同时显示歌词

java一个音乐播放程序,同时显示歌词 总的来说分为两部分:1.音乐播放 2.显示歌词(这里介绍一个好理解的算法,就不进行优化了) 一、音乐播放(这里我们在网上先下载一个wav文件来播放) 这里我们使用...我们需要知道JDK原生只支持音频格式为*.wav *.au *.aiff 的音乐 如果我们不希望使用JDK原生支持,就需要自己使用jar包(下面代码我是使用JDK原生支持的播放器来写的) 注意一下我的两个资源,一个是邓紫棋泡沫的歌曲....wav,一个是邓紫棋画的歌.lrc(因为实在没找到邓紫棋画的wav文件就先对付上了…) // JDK自带音乐播放无需导包 public static void MusicPlayer() { try...; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException...; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import

1.9K10

Java虚拟机-03:当new一个对象时,虚拟机发生了什么?

Java是一门面向对象的编程语言,在Java程序运行的过程当中,随时都会有对象创建出来,从语言层面上来讲,创建对象通常仅仅是使用一个new关键字而已,那在虚拟机层面,对象的创建又是一个什么样的过程呢...本文聊一聊,当new 一个对象时,虚拟机中发生了什么。这里一共分为五个步骤。...空闲列表 如果JAVA堆中的内存并不是规整的,使用的内存和未使用的内存相互交错,这样的话就没有办法进行简单的指针碰撞了,虚拟机就必须维护一个列表,列表上记录着,哪些内存是可用的,哪些内存是不可用的。...在划分可用空间这一部之外,还有另一个需要考虑的问题是对象创建在虚拟机中是非常频繁的行为,即使仅仅修改一个指针指向的位置,在并发情况下也并不是线程安全的,可能会出现正在给对象A分配内存,指针还没来得及及时修改...5.执行init方法 到这一步,从虚拟机的角度来看,一个新对象已经产生了,但从java程序的视角来看,对象创建才刚刚开始,init方法还没有执行,所有的字段都还为零,在执行new指令后,会接着执行init

46620

Java一个简单的缓存操作类

前言 使用缓存已经是开发中老生常谈的一件事了,常用专门处理缓存的工具比如Redis、MemCache等,但是有些时候可能需要一些简单的缓存处理,没必要用上这种专门的缓存工具,那么自己一个缓存类最合适不过了...一、分析 首先分析一下缓存类该如何设计,这里我以一种非常简单的方式来实现一个缓存类,这也是我一直以来使用的设计方案。...为了明确功能,首先定义一个接口类CacheInt,然后是缓存实现的工具类CacheUtil。...最后一个方法就是清理过期缓存,这里你可以选择启动一个监听线程实时地清理缓存,也可以选择在适当时机进行一次清理,比如我这里就是在存在put和get操作时固定或概率地清理缓存。 ?...三、并发测试 普通的实现测试这里就不展示了,肯定是没问题的,读者简单一些测试样例即可,这里主要展示一下并发测试,因为在实际情况中存在并发处理缓存情况,为了确保其正确性,所以并发测试是必须要做的,下面放出我的测试样例

1.6K20
领券