java
文章平均质量分 67
congyh
求其上者得其中, 求其中者得其下.
展开
-
JVM - 内存区域划分 与 内存溢出异常
主要介绍以下内容: Java虚拟机内存的各个区域, 这些区域的作用, 服务对象以及其中可能产生的问题运行时数据区域概览图程序计数器(Program Counter Register)可以看做当前线程所执行的字节码的行号指示器. 在多线程程序中, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要一个独立的程序计数器, 独立存储, 我们称这类内存区域为线程私有的内存.如果正在执行一个Java方法,原创 2017-03-07 09:33:58 · 961 阅读 · 0 评论 -
JVM - 内存区域划分 与 内存溢出异常
主要介绍以下内容: Java虚拟机内存的各个区域, 这些区域的作用, 服务对象以及其中可能产生的问题运行时数据区域概览图程序计数器(Program Counter Register)可以看做当前线程所执行的字节码的行号指示器. 在多线程程序中, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要一个独立的程序计数器, 独立存储, 我们称这类内存区域为线程私有的内存.如果正在执行一个Java方法,原创 2017-03-20 22:17:18 · 1062 阅读 · 0 评论 -
java Future用法和意义 - 一句话击破
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。 但后者需要前者的结果,就需要用callable接口了。 callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以转载 2017-03-07 14:49:40 · 1536 阅读 · 0 评论 -
Java并发编程- 内存模型详解
本文分为四个部分来讲解:Java内存模型的基础, 主要介绍内存模型相关的基本概念;Java内存模型中的顺序一致性, 主要介绍重排序与顺序一致性内存模型;同步原语, 主要介绍三个同步原语(synchronized, volatile, final)的内存语义及重排序规则在处理器中的实现;Java内存模型的设计, 主要介绍Java内存模型的设计原理, 及其与处理器内存模型和顺序一致性内存模型的关原创 2017-03-07 09:36:17 · 675 阅读 · 0 评论 -
JMX学习笔记(一)-MBean
一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备、一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口可以读取或者写入一些对象中的属性,通常一个MBean需要定义一个接口,以MBean结尾, 例如: EchoMBean, 格式为XXXMBean,这个是规范,必须得遵守转载 2017-03-20 19:24:11 · 645 阅读 · 0 评论 -
Java并发编程 - 基础
并发的历史操作系统的发展使得多个程序能够同时运行, 由操作系统来分配资源, 如果需要的话, 进程会通过一些原始的机制相互通信, 主要分为消息传递和共享内存两种:消息传递: Socket, 信号处理(signal handlers), 信号量(semaphores)和文件等.共享内存线程共享其所属进程的内存地址空间, 因此所有同一进程中的线程访问相同的变量, 并从同一个堆中分配对象, 这相对于进程原创 2017-03-07 09:41:13 · 616 阅读 · 0 评论 -
Java并发编程 - 锁 - 原理详解
Java并发编程中, 锁机制对控制线程间共享内存的使用有重要的意义. 那么在Java内部锁是如何实现的呢?首先要明确一个概念. Java中的锁是对象级别的概念, 也就是每个对象都天生可以作为一个锁使用.究其底层实现, 实际上锁是存在于Java对象头的MarkWord字段里的, 根据锁的级别, 存储结构不同, 但是都存在一个2bit的锁标识位.悲观锁悲观锁是synchronize内部的实现机制,原创 2017-03-07 09:40:31 · 995 阅读 · 0 评论 -
Java并发编程 - 常用容器(ConcurrentHashMap, ConcurrentLinkedQueue)
ConcurrentHashMap的实现原理与使用传统的HashMap不是线程安全的, 所以多线程进行put()和get()操作的时候可能会引发问题. 还有一个叫做HashTable的数据结构, 它使用的是synchronized来保证线程安全, 但是效率很低, 因为不能并发读.ConcurrentHashMap采用的是锁分段技术, 将数据分成一段一段存储, 然后给每一段数据配一把锁, 当一个线原创 2017-03-07 09:40:09 · 2338 阅读 · 0 评论 -
Java解惑 - sleep和wait/notify机制, 线程阻塞和等待的区别
sleep()方法sleep()方法是定义在Thread上的native方法, 在设定时间段内(精度取决于CPU)阻塞线程的执行, 但是并不更改线程的锁持有情况.wait/notify机制wait()方法是定义在Object上的方法, 是java语言级的方法, 需要在同步块或者同步方法中进行调用, 会释放锁, 并进入锁对象的等待队列, 需要等到其他线程调用notify()方法释放锁后(实际上该线程原创 2017-03-07 09:39:24 · 14976 阅读 · 1 评论 -
Java并发编程 - volatile, synchronize关键字实现原理
Java代码在编译后会变成Java字节码, 字节码被ClassLoader加载到JVM中, JVM执行字节码, 最终要转化为汇编指令在CPU上执行, Java中所使用的并发机制依赖于JVM的实现和CPU的指令.volatile原语volatile是轻量级的synchronized, 它在多CPU(注意不仅仅是多核)开发中保证了共享变量的可见性. 由于volatile只保证了可见性, 无法保证原子性原创 2017-03-07 09:38:38 · 1993 阅读 · 0 评论 -
Java - 迭代器的使用
迭代器主要是为了支持容器类的遍历, 发展历程如下.Java 1.5 之前的做法如果你用的是Java 1.5之前支持的类库, 那么很可能采用的是如下的做法来遍历集合元素: 使用iterator()要求容器返回一个Iterator, Iterator将准备好返回序列的第一个元素;使用next()获得序列中的下一个元素;使用hasNext()检查序列中是否还有元素;使用remove()将迭代器返回原创 2017-03-07 09:37:28 · 8803 阅读 · 0 评论 -
Java 8 - 通过lambda表达式进行惰性计算
lambda表达式的出现使得JDK8内部发生了很多有趣的变化, 其中就包括惰性计算的特性. 这里以JDK标准库中的Logger为例, 1.8以前的log方法有如下签名:public void log(Level level, String msg) { if (!isLoggable(level)) { return; } L原创 2017-03-07 09:36:57 · 2117 阅读 · 0 评论 -
Java并发编程 - 线程池
线程池是一种生产者/消费者模式的实现.线程池处理任务的流程ThreadPoolExecutor是一种线程池的实现, 它执行execute()的处理流程如下:上图中与新创建线程有关的步骤都需要获取全局锁, 所以线程池中应当尽量避免进行新线程的创建. 实际上在ThreadPoolExecutor完成预热之后(corePoolSize已满)的时候, 几乎所有的execute()方法都是执行入队操作.原创 2017-03-07 09:35:51 · 417 阅读 · 0 评论 -
Java并发编程 - Executor框架详解
Executor框架(接口)负责在用户级别进行任务的调度和执行, 实现了任务调度和执行的分离.Executor框架简介Executor框架的两级调度模型在上层, Java程序通过将应用分解为若干个任务(task), 然后使用用户级的调度器(Executor框架)将task映射为固定数量的Java线程.在底层, Java线程与操作系统的线程是一一对应的关系, 由操作系统调度给可用的CPU. 底层的调原创 2017-03-07 09:35:25 · 722 阅读 · 0 评论 -
Java - 日志收集与处理
日志的出现是为了弥补使用System.out.println()进行调试的不足. 因为打印语句需要我们一条一条手动控制.日志的管理分为两大部分:日志记录器日志处理器日志记录器负责按设定级别对日志进行记录和向上传递, 日志处理器负责按设定级别对日志进行打印.日志记录器使用全局日志记录器最简单的使用情况是通过调用Logger.getGlobal()获得全局日志记录器. 然后通过info()这样的方原创 2017-03-07 09:34:48 · 7357 阅读 · 0 评论 -
Java日志全解析(上) - 源流
作为Java程序员,幸运的是,Java 拥有功能和性能都非常强大的日志库;不幸的是,这样的日志库有不止一个——相信每个人都曾经迷失在JUL(Java Util Log), JCL(Commons Logging), Log4j, SLF4J, Logback,Log4j2 等等的迷宫中。在我见过的绝大多数项目中,都没有能够良好的配置和使用日志库。转载 2017-03-31 16:28:28 · 2165 阅读 · 0 评论