java
zbuger
这个作者很懒,什么都没留下…
展开
-
happens-before
近来学习并发知识,看到了一段很经典的代码,如下:count = 1;线程1{操作1: count++;}线程2{操作2:count++;}在并发环境下,线程1和线程2同时执行自己的操作,那么操作的结果一定是3吗? 我们知道count++并不是原子操作,count++在计算机执行指令的时候 会把该操作分解成三个过程,1.给中间变量取值,2.中间变量值+1,3.再赋值给原来的变量。原创 2016-03-23 21:53:52 · 362 阅读 · 0 评论 -
Synchronize实现原理(很难)
在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供Lock API外还在语法层面上提供了synchronized关键字来实现互斥同步原语。那么到底在JVM内部是怎么实现synchronized关键子的呢?一、synchronized的字节码表示: 在java语言中存在两种内建的synchronize转载 2016-03-31 22:25:15 · 14523 阅读 · 1 评论 -
jvm参数设置
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xms355原创 2016-03-26 21:58:33 · 326 阅读 · 0 评论 -
Struts2 json
本文转载自网络,点击阅读原文早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身,渐渐的也淡忘了此事。直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章,从头到尾将Struts2与JSON的关系说清楚。 其实原创 2016-03-19 21:22:22 · 283 阅读 · 0 评论 -
深入解析String intern
引言在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的String对象会直接存储在常量池中。如果不是用双引号声明的St转载 2016-03-13 12:57:31 · 334 阅读 · 0 评论 -
java nio aio bio
【转自】http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞?转载 2016-03-11 09:44:18 · 322 阅读 · 0 评论 -
java内置锁synchronized的可重入性
当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞. 我们来看看synchronized,它拥有强制原子性的内置锁机制,是一个重入锁,所以在使用synchronized时,当一个线程请求得到一个对象锁后再次请求此对象锁,可以再次得到该对象锁,就是说在一个synchronized方法/块的内部调用本类的其他s转载 2016-03-08 20:29:02 · 357 阅读 · 0 评论 -
CopyOnWrite容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2016-03-18 23:14:26 · 499 阅读 · 0 评论 -
java static锁和非static锁区别
第一部分: synchronized 与static synchronized 的区别第二部分:JVM底层又是如何实现synchronized的第三部分:java多线程锁,源码剖析第一部分: synchronized 与static synchronized 的区别1、synchronized与static synchronized 的区别转载 2016-03-08 15:47:52 · 10685 阅读 · 0 评论 -
java回调
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中转载 2016-03-28 16:34:38 · 328 阅读 · 0 评论 -
java面试重点
1.Java基础 ArrayList,HashMap等集合框架类,重要基础类String等的处理。HashMap的底层存储结构等。 (也可以顺带考察下对接口,继承,重载重写的基本理解;以及异常处理的注意事项)。 2. 数据结构与算法 常见的查找算法及时间复杂度。 常见的排序算法及时间复杂度。 比较重要的数据结构,如链表,队列,栈的基本理解及大致实转载 2016-04-07 14:13:14 · 401 阅读 · 0 评论 -
聊聊JVM的年轻代
http://ifeve.com/jvm-yong-generation/1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们转载 2016-03-25 10:32:37 · 349 阅读 · 0 评论 -
java volatile内存操作细节
在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量原创 2016-04-03 16:48:46 · 507 阅读 · 1 评论 -
JNDI 是什么
JNDI 是什么JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。那么,JNDI到底起什么作用?要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”转载 2016-03-22 10:32:06 · 306 阅读 · 0 评论 -
悲观锁 乐观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人转载 2016-03-20 13:34:55 · 290 阅读 · 0 评论 -
Spring Bean生命周期
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例.Spring 中bean 的生命周期短暂吗?在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一转载 2016-03-31 20:15:54 · 328 阅读 · 0 评论 -
JVM调优工具
http://pengjiaheng.iteye.com/blog/552456Jconsole,jProfile,VisualVMJconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里 JProfiler:商业软件,需要付费。功能强大。详细说明参考这里 Visua转载 2016-03-23 21:22:58 · 448 阅读 · 0 评论 -
java类实例化顺序
public class Initializing { public static void main(String[] args) { new TestSub(); }}class Sample { Sample(String s) { System.out.println(s); } Sample() { Syste原创 2016-04-06 10:17:10 · 429 阅读 · 0 评论 -
jvm调优(一)
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAd转载 2016-03-25 10:09:05 · 325 阅读 · 0 评论 -
静态类 非静态类
java没有直接的静态类这种东西,一个类正常是能被public, abstract & final 修饰。一个类可以为static的情况只是他作为另一个类的成员,static表明他可以不用建立实例被访问而已,这样的内部类完全没有内部类的特点1 内部类可以访问所在外部类的成员变量和方法,而静态内部类却不能2 内部类可以使用Outter.this作为外部类引用,但静态内部类不能使用3 静态内部类原创 2016-03-29 09:52:17 · 412 阅读 · 0 评论 -
java反射原理
要想理解反射,首先得了解类的加载过程,看下图: 我们的源代码经过编译之后变成字节码,然后在JVM中运行时通过类加载器加载字节码在内存中生成Class类对象,这个Class类对象内包含有field对象(类的成员变量生成)、constructor对象(类的构造方法生成)和method对象(类的方法生成)。当我们拿到一个类或者对象的时候就可以通过反射对它们进行转载 2016-04-11 10:26:20 · 885 阅读 · 0 评论 -
Sun JVM 年轻代和老年代垃圾回收都需要暂停JVM
The Young Generation is where all new objects are allocated and aged. When the young generation fills up, this causes a minor garbage collection. Minor collections can be optimized assuming a high obj转载 2016-07-28 22:20:05 · 1224 阅读 · 0 评论 -
淘宝开源Key/Value结构数据存储系统Tair技术剖析
作者 余刚 发布于 2010年9月8日Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。Tair于2010年6月30号在淘宝开源平台上正式对外开源,本文较详细地介绍了Tair提供的功能及其实现的细节,希望对大家进一步了解Tai转载 2016-06-19 21:34:21 · 469 阅读 · 0 评论 -
分布式系统数据一致性
在前面三篇文章中,介绍了关于分布式系统中数据一致性的问题,这一篇主要介绍CAP定理以及自己对CAP定理的了解。CAP定理是2000年,由 Eric Brewer 提出来的Brewer认为在分布式的环境下设计和部署系统时,有3个核心的需求,以一种特殊的关系存在。这里的分布式系统说的是在物理上分布的系统,比如我们常见的web系统。这3个核心的需求是:Consistency,Av转载 2016-04-03 23:16:32 · 506 阅读 · 0 评论 -
静态成员的垃圾回收
今天在网上看到一个讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收。原文链接下面就对Java中的垃圾回收和静态类型做一些总结:一、Java中的内存分配1、stack(栈),用于装变量和引用类型。如基本类型和引用类型的引用变量。 2、heap(堆) ,用于装new出来的值。 3、用来装静态变量的区域。如static变量,字符串常量。 4、转载 2017-04-20 10:00:41 · 2366 阅读 · 0 评论 -
java堆外内存
JVM可以使用的内存分外2种:堆内存和堆外内存. 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。转载 2017-04-23 15:12:07 · 813 阅读 · 0 评论 -
使用sun.misc.Cleaner或者PhantomReference实现堆外内存的自动释放
Java NIO包是通过sun.misc.Cleaner和PhantomReference来实现堆外内存的自动释放的。现在我们来学习下Cleaner和PhantomReference的使用,自己封装实现堆外内存的自动释放。sun.misc.Cleaner是JDK内部提供的用来释放非堆内存资源的API。JVM只会帮我们自动释放堆内存资源,但是它提供了回调机制,通过这个类能方便的释放系统的转载 2017-04-23 16:16:01 · 619 阅读 · 0 评论 -
直接内存和堆内存的性能比较
背景知识在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。 显转载 2017-04-23 21:33:12 · 717 阅读 · 0 评论 -
ByteBuffer常用方法详解
缓冲区(Buffer)缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数举个简单的例子,比如A地有1w块砖要搬到B地由于转载 2017-04-23 21:56:25 · 2571 阅读 · 0 评论 -
Concurrent and Parallel Programming
What's the difference between concurrency and parallelism?Explain it to a five year old.Concurrent = Two queues and one coffee machine.Parallel = Two queues and two coffee machines.转载 2016-07-28 22:12:56 · 606 阅读 · 0 评论 -
synchronize深入理解
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。1. synchronized 方法:通过在方法声明中加转载 2016-07-05 21:57:38 · 3417 阅读 · 0 评论 -
Jetty 9嵌入式开发
官方网址:http://www.eclipse.org/jetty/下载地址:http://download.eclipse.org/jetty/stable-9/dist/文档网址:http://www.eclipse.org/jetty/documentation/当前Jetty网址上推荐使用的稳定版本:Jetty9.0。介绍 Jet转载 2016-06-19 19:44:07 · 1974 阅读 · 0 评论 -
java atomic
http://ifeve.com/java-atomic/引言Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。Atomic包介绍转载 2016-04-02 16:07:46 · 469 阅读 · 0 评论 -
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。这次,先说说三大框架整合过程。个人认转载 2016-05-13 21:18:28 · 625 阅读 · 0 评论 -
Unsupported major.minor version 51.0解决办法
我使用的是Eclipse-jee-indigo + JDK 1.6.23环境,结果使用时出现Unsupported major.minor version 51.0错误提示,下面我来介绍Unsupported major.minor version 51.0错误的解决办法今天偶然间同事遇到一个问题,也加深了自己对eclipse中build path和java compiler comp转载 2016-05-20 09:55:10 · 435 阅读 · 0 评论 -
JNDI 是什么
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。那么,JNDI到底起什么作用?要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。转载 2016-06-07 11:24:33 · 304 阅读 · 0 评论 -
java消息机制
1、问: 什么是 Java 消息服务?答: Java 消息服务(Java Message Service,JMS) API 是一个用于访问企业消息传递系统的 API。是 Java 2 Platform, Enterprise(J2EE)的一部分。2、目前流行的消息传送产品有哪些?答:目前流行的有ActiveMQ、IBM WebSphere MQ、SonicMQ等3、什么时候转载 2016-07-10 17:05:48 · 646 阅读 · 0 评论 -
一道面试题比较synchronized和读写锁
一、科普定义这篇博文的两个主角“synchronized”和“读写锁”1)synchronized这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用,在这就不多说只做几点归纳:Java提供这个关键字,为防止资源冲突提供的内置支持。当任务执行到被synchronized保护的代码片段的时候,它检查锁是否可用,然后获取锁,执行转载 2016-06-07 11:57:23 · 1768 阅读 · 1 评论 -
volatile关键字[推荐]
Volatile关键字平时在阅读jdk源码的时候,经常看到源码中有写变量被volatile关键字修饰,但是却不是十分清除这个关键字到底有什么用处,现在终于弄清楚了,那么我就来讲讲这个volatile到底有什么用吧。当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对转载 2016-03-31 12:14:36 · 319 阅读 · 0 评论 -
java可重入锁
目录什么是可重入锁为什么要可重入如何实现可重入锁有不可重入锁吗demo代码展示参考文章1 . 什么是可重入锁锁的概念就不用多解释了,当某个线程A已经持有了一个锁,当线程B尝试进入被这个锁保护的代码段的时候.就会被阻塞.而锁的操作粒度是”线程”,而不是调用(至于为什么要这样,下面解释).同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁jav转载 2016-07-04 11:03:43 · 1624 阅读 · 0 评论