摘要:
在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。下面一幅图描述这写交互volatile关键字在Java编程中,应用的比较少,主要原因无外乎 阅读全文
摘要:
一直以来似乎都有一个错觉,认为map跟其他的集合类一样继承自Collection,其实不然,Map和Collection在结构层次上是没有任何关系的,通过查看源码可以发现map所有操作都是基于key-value对,而不是单独的元素。下面以HashMap为例子,深入对Map的实现机制进行了解,在这个过程中,请打开jdk源码。Hash算法HashMap使用Hash算法,所以在解剖HashMap之间,需要先简单的了解Hash算法,Hash算法一般也成为散列算法,通过散列算法将任意的值转化成固定的长度输出,该输出就是散列值,这是一种压缩映射,也就是,散列值的空间远远小于输入的值空间。简单的说,hash 阅读全文
摘要:
位运算符用来对二进制位进行操作,分为左移位操作和右移位操作。左移位运算符 ●左移位运算的符号为>,右移位运算符左面的操作元称作被移位数,右面的操作数称作移位量。 ●特点 ◆是双目运算符。 ◆操作元必须是整型类型的数据。 ●右位移的过程 ◆假设a是一个被移位的整型数据,n是位移量。 ◆a>>n运算的过程是通过将a的所有位都右移n位,每右移一个位,右边的最低位(即右边的第1位)上的0或1被移出丢弃,并用0或1填充左边的高位(a是正数时用0填充,负数时用1填充)。 ◆比如:对整形数 8>>1的计算 8的二进制表示: 0000,0000,0000,0000,0000,.. 阅读全文
摘要:
1.Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,在调用的时候都是Thread.sleep(long)/Thread.yield()的方式进行调用。而join()是由线程对象来调用。2. Thread.sleep(long)是让当前运行的线程睡眠一会,这里说的睡眠的意思是让线程从运行状态进入阻塞状态,只有等阻塞时间过后才进入就绪状态(并不是直接进入运行状态),是否进入运行状态就要看jvm的内部调用机制了,通常是级别较高的处于就绪状态的线程会被调度进入就绪状态。3. 线程如果是通过继承Thread类,重写起run方法来实现的,那么在调用Thre 阅读全文
摘要:
线程同步什么是线程同步?当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。实现同步机制有两个方法:1。同步代码块:synchronized(同一个数据){}同一个数据:就是N条线程同时访问一个数据。2。同步方法:public synchronized 数据返回类型 方法名(){}就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过 阅读全文
摘要:
一。线程的一些基本知识。进程与线程所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。进程(process)当一个程序进入内存运行即变成一个进程,进程处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调用的独立单位,进程切换开销大。多进程在操作系统中,能同时运行多个任务程序。进程包含三大特征1,独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间,没有经过进程本身允许的情况下,一个用户不可以直接访问其他进程的地址空间。2 阅读全文