![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础知识
文章平均质量分 71
Zephyr_7
码农
展开
-
关于java和c++中 i=i++结果不同的分析
学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试: JAVA: public class test { public static void main(String args[]) { inti,j; i转载 2015-10-17 14:55:24 · 2162 阅读 · 1 评论 -
Thread类中值得注意的方法
1,Sleep(long)让出cpu的使用权,不释放锁 Wait(long)让出cpu使用权,并释放锁。 2,Join()是通过wait函数实现的主线程阻塞。 3,interrupted()函数是Thread静态函数,用来检测当前线程的interrupt状态,检测完成后,状态清空 4,yield()函数告诉cpu我可以让出使用权了,同优先级的线程可以使用了,并不一定立即让出,让出后原创 2016-08-06 16:12:08 · 2596 阅读 · 0 评论 -
Java线程面试题 Top 50
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited。欢迎加入Java小组。转载请参见文章末尾的要求。 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位转载 2016-08-06 16:52:27 · 390 阅读 · 0 评论 -
CAS操作ABA问题发生的场景
最开始看一些资料,提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,开始十分的费解,怎么可能呢,A变回了A就应该能够CAS成功啊,为什么会不成功呢?于是去查了一些资料,其中提到了两种情况: 第一种,A最开始的内存地址是X,然后失效了,有分配了B,恰好内存地址是X,这时候通过CAS操作,却设置成功了。这种情况在带有GC的语言中,这种情况是不可能发生的,为什么呢?原创 2016-08-06 23:10:00 · 6724 阅读 · 4 评论 -
总结:对Java内存模型JMM的理解
JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。JMM对程序员屏蔽了CPU以及OS内存的使用问题,能够使程序在不同的CPU和OS内存上都能够达到预期的效果。 在jsr-133中是这么定义的 A memory model describes, given a原创 2016-08-08 16:29:00 · 4068 阅读 · 0 评论 -
对Volatile变量的理解和总结
之前因为对Volatile变量的理解不够深刻,只是知道它可以轻量级的锁,但是在真正编写多线程的程序时,除用它来做为线程结束的标志外,并不敢过多的使用。但是在看Current包中的大部分源码时发现,作者居然使用Volatile变量加CAS操作实现了很多只有通过加锁才能实现的功能,叹为观止。然后就在前面了解了JMM的基础上,又去详细的了解了一下Volatile变量的使用。volatile变量的读写对所原创 2016-08-08 17:40:46 · 2888 阅读 · 0 评论 -
Java程序执行超时——Future接口介绍
public interface Future Future 表示异步计算的结果。 Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 Future 主要定义了5个方法: 1)boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某转载 2016-08-31 17:00:55 · 1074 阅读 · 0 评论 -
关于两个被final修饰的byte相加赋值给一个byte变量,会不会编译出错的问题
上代码byte b1=1,b2=2,b3,b6,b8; final byte b4=4,b5=6,b7=125; b6=b4+b5; //(1)不会发生编译错误b3=(b1+b2); //(2)会发生编译错误b8=b5+b7; //(3)会发生编译错误System.out.println(b3+b6); 代码块(2)位置肯定会出现编译错误。具体原因 b1和b...原创 2018-04-06 23:42:14 · 1425 阅读 · 0 评论 -
ByteBuffer的Put和Get的用法和要注意的细节
最近再看java的NIO,里面提到了几个基本的类,其中ByteBuffer是最基础的,用于Channel的读写传输数据使用。下面总结一下我理解的ByteBuffer。 先从代码开始分析 static public void asIntBuffer() { ByteBuffer bBuf = ByteBuffer.allocate(512); bBuf.putI原创 2016-08-05 13:07:25 · 23650 阅读 · 1 评论 -
从字节码指令分析i=i++(i是long类型时)
刚写了个编文章说int i=i++的问题,之后想是iinc指令直接操作本地变量表草成的么,随之用long做了一下实验,看代码和编译后的指令,public static void iAdd(long i) { i = i++; System.out.println(i); }变异后的code的第1行的意思是复制栈顶一个(long、double型的)或两个原创 2016-08-01 17:22:52 · 1718 阅读 · 0 评论 -
从字节码指令分析i=i++(i是int类型时)
先放出代码和编译后的指令集和 public void iAdd(int i) { i = i++; }分析指令集和:iload_1 将本地变量表的中1 slot的变量值压人栈顶;//此时战中的‘i’为1iinc 1,1 本地变量表中的1 solt位置的变量加1 //本地变量表里的i为2istore_1 将栈顶元素弹出存入1原创 2016-08-01 16:46:16 · 487 阅读 · 0 评论 -
java 中的 wait()方法和 sleep()方法的区别
sleep()和wait()的区别Java中的多线程是一种抢占式的机制而不是分时机制。线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。当有多个线程访问共享数据的时候,就需要对线程进行同步。线程中的几个主要方法的比较: Thread类的方法:sleep(),yield()等原创 2015-10-16 16:23:38 · 14886 阅读 · 3 评论 -
常见HTTP错误代码大全
一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认原创 2016-05-01 22:41:37 · 607 阅读 · 0 评论 -
JVM垃圾回收的二次标记
在根搜索中得到的不可达对象并不是立即就被标记成可回收的,而是先进行一次标记放入F-Queue等待执行对象的finalize()方法,执行后GC将进行二次标记,复活的对象之后将不会被回收。因此,使对象复活的唯一办法就是重写finalize()方法,并使对象重新被引用。上面是引用了一篇博客里面的话,基本上和《深入理解java虚拟机》里面‘对象的生存和死亡中’提到的内容差不多,有一点,finalize()原创 2016-08-03 14:01:42 · 2137 阅读 · 0 评论 -
JVM垃圾回收算法
标记-清除算法标记:前面blog提到的二次标记。 清除:回收所有被标记的对象清除。 优点:算法简单 缺点:效率不搞,标记和清除两个阶段效率都不高;碎片问题,清除阶段会产生大量的内存碎片,即使有足够的空间但是不连续,还会出发垃圾回收。复制算法将可用内存分为大小相等的两块,每次只使用其中一块,当正在使用的一块内存不足出发GC后,将存活的对象复制到未使用的一块,然后将之前使用的一块内存全部清除掉。原创 2016-08-03 15:00:26 · 475 阅读 · 0 评论 -
jvm垃圾收集器回收什么样的对象以及各种引用
1.GCjvm可大致分为5部分,其中程序计数器、虚拟机栈、本地方法栈,是线程私有的,随线程分方法的调用生灭。GC回收的对象主要集中在堆区和方法区。(1)回收什么样的对象引用计数法:· 每当一个地方引用该对象,该对象的引用计数器加1,引用失效后引用计数器减1。算法简单,快速,但是无法解决循环引用的问题,维护引用计数器增加消耗。目前jvm没有采用该算法。可达性分析:原创 2016-08-03 11:22:35 · 1558 阅读 · 0 评论 -
关于string stringbuffer stringbuilder速度的考虑
之前有面试官也问过,但是在平时并没有感觉出三者有什么太大的不同,但是最近在读《java特种兵》一书,感觉三者的文章真的很多。一般认为在字符串的拼接时三者的顺序是:StringBuilder>StringBuffer>String。StringBuilder是线程不安全的,StringBuffer线程安全,多线程下会锁定对象,时间略慢,String在字符串操作时会产生新的字符原创 2016-07-31 11:37:09 · 485 阅读 · 0 评论 -
Full GC会不会回收年轻代讨论
最近在看JVM相关的资料的时候提到了一个空间分配担保的问题,大体意思就是: 在1.6 update24之前,在发生minor GC前虚拟机会检查老年代最大的可用的连续空间是否大于年轻代所有对象的总和,弱国这个条件成立,则MinorGC是安全的。如果不成立,则虚拟机查看HandlePronotionFailure是否设置允许担保失败,如果允许则继续检查老年代最大的连续可用空间是否大于历次进入来年代原创 2016-08-04 11:39:41 · 2883 阅读 · 0 评论 -
关于javap编译后多出一部分代码以及finnaly块中加return 无法抛出异常的看法
先看代码static int test() throws Exception{ int i = 0; try { i = i+2; return i; } finally{ i=i+1; } }比较简单,之前知道finally块如果没有返回语句是不影响ret原创 2016-08-04 18:29:48 · 952 阅读 · 0 评论 -
Java 中list(ArrayList)的foreach遍历方式调用list的remove删除元素,不抛出ConcurrentModificationException
关于list删除元素的当时有很多,具体可以参考下面这个博客。https://blog.csdn.net/claram/article/details/53410175里面提到了list的foreach遍历方式删除元素,会抛出ConcurrentModificationException。foreach是迭代器遍历的一种简写。 但是,如果list中只有两个元素,删除第一个元素时,则不会...原创 2018-05-13 19:54:48 · 946 阅读 · 0 评论