
java
文章平均质量分 81
Hunaiyo
本人为广工一苦逼呈虚猿。
展开
-
生产者/消费者问题的多种Java实现方式
生产者/消费者问题的多种Java实现方式 实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用的异步流水开发框架的设计与实现》中将介绍一种生产者/消费者模式的具体应用。生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作转载 2016-02-24 13:39:12 · 597 阅读 · 0 评论 -
为什么volatile不能保证原子性而Atomic可以
转载自:http://www.cnblogs.com/Mainz/p/3556430.html在Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volatile,是java中的一个我觉得这个词在Java规范中从未被解释清楚的神奇关键词,在Sun的转载 2016-01-25 12:02:21 · 744 阅读 · 0 评论 -
java.util.concurrent介绍
(本文由 blog博主Caoer(草儿)原创,此处为转载。 ) java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以提高并发类的线程安全、可伸缩性、性能、可读性和可靠性转载 2016-01-03 08:54:51 · 526 阅读 · 0 评论 -
Java中对类的主动引用和被动引用
在Java代码中,有些类看上去初始化了,但其实没有。例如定义一定长度某一类型的数组,看上去数组中所有的元素已经被初始化,实际上一个都没有。对于类的初始化,虚拟机规范严格规定了只有对该类进行主动引用时,才会触发。而除此之外的所有引用方式称之为对类的被动引用,不会触发类的初始化。虚拟机规范严格地规定了有且仅有四种情况是对类的主动引用,即必须立即对类进行初始化。四种情况如下:转载 2015-12-22 12:39:31 · 743 阅读 · 0 评论 -
利用反射获得类信息,以获得泛型为例
java源文件编译成.class字节码。运行时加载类的时候就是加载.class文件。这也是java为什么可以一次编译多次运行!只要我们得到.class文件那就可以获得类信息!可以利用反射!方式一:对象.getClass()方法是 根对象Object的方法。 是其他类继承Object的getClass方法。方式二:类名.class,你可以理解为字节码本身就是静态的,类加载的时字节原创 2015-12-21 11:28:59 · 1555 阅读 · 0 评论 -
三种常见的编码:ASCII码、UTF-8编码、Unicode编码等字符占据的字节数
ASCII码: 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。 UTF-8编码: 一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。 Unicode编码: 一个英文等于两个字节,一个中文(含繁体)原创 2015-08-24 10:56:58 · 19554 阅读 · 0 评论 -
抽象类(Abstract)和接口的不同点、共同点(Interface)。
相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 (2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后http://weibo.com/huangyiweix原创 2015-08-24 10:05:14 · 1425 阅读 · 0 评论 -
java泛型的内部原理:类型擦除以及类型擦除带来的问题
参考:java核心技术一、Java泛型的实现方法:类型擦除前面已经说了,Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参转载 2015-08-17 15:10:19 · 498 阅读 · 0 评论 -
java同步方法和同步代码块详解(通俗地讲解)
打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法),和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。在此我们先来明确一下我们的前提条件。该对象转载 2015-08-07 16:18:38 · 1106 阅读 · 0 评论 -
Collection集合的总结以及如果选择适合的集合(包括对List和Set的对比)
Collection |--List 有序,可重复 |--ArrayList 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高 |--Vector 底层数据结构是数组,查询快,增删慢。 线程安全,效率低 |--LinkedList 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高 |--Set 无序,唯一 |--HashSet 底层数据结构是哈希表。 如何保证元素唯一性的呢? 依赖两个方原创 2015-08-05 16:50:58 · 1508 阅读 · 0 评论 -
HashSet如何保证元素的唯一性-跟踪源码解析
自己的理解:HashSet的底层结构用的是HashMap,当往HashSet上添加一条元素时。调用HashMap的put方法先调用hashCode()方法判断key的hash值是否一样,再调用对象的equals方法。原创 2015-08-05 16:16:50 · 1940 阅读 · 0 评论 -
for 、foreach和iterator的区别
相同点: 三个都可以用来遍历数组和集合不同点:1.形式差别 for的形式是 for(int i=0;i foreach的形式是 for(int i:arr){...} iterator的形式是原创 2015-08-04 17:24:18 · 863 阅读 · 0 评论 -
java内存机制说明(简单明了)
Java虚拟机在执行Java程序的过程中会把它所管理的内存区域分为若干个不同的数据区域。这些区域都有各自的用途,有的区域随虚拟机进程启动而存在,有的区域则依赖用户线程启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域。程序计数器程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就原创 2015-08-04 10:33:31 · 612 阅读 · 0 评论 -
聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index)介绍
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)…… (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索转载 2015-07-31 16:58:00 · 1250 阅读 · 0 评论 -
sql语句的性能优化问题
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:select * from table1 where name='zhangsan' and tID > 10000和执行:select * from table1 where tID > 10000 and name='zhangsan'一些转载 2015-07-31 15:50:42 · 448 阅读 · 0 评论 -
数组跟集合的区别
数组跟集合的区别 A:长度区别 数组的长度固定,实例化时必须规定数组长度。(不可变) 集合长度可变 B:内容不同 数组存储的是同一类型的元素 集合可以存储不同类型的元素 C:元素的数据类型问题 数组可以存储基本数据原创 2015-07-30 11:43:29 · 792 阅读 · 0 评论 -
jdk的动态代理源码解析
先看一下JDK的动态是怎么用的。 Java代码 package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /**原创 2015-07-29 16:47:04 · 981 阅读 · 0 评论 -
class.forName的官方用法说明
原文地址:http://yanwushu.sinaapp.com/class_forname/使用jdbc方式链接数据库时会经常看到这句代码:Class.forName(String className)。本文将浅显地解读这句代码的含义。看这篇文章之前应该对java的反射机制有所了解,至少是对Class类有一定的了解。官方文档初始原创 2015-07-29 16:28:14 · 685 阅读 · 0 评论 -
Java集合类详解
Java容器类Collection、List、ArrayList、Vector及map、HashTable、HashMap区别 Collection是List和Set两个接口的基接口 List在Collection之上增加了"有序" Set在Collection之上增加了"唯一" 而ArrayList是实现List的类...所以他是有序的. 它里转载 2015-07-15 19:36:09 · 456 阅读 · 0 评论 -
解惑内部类(结合代码,一解就懂)
内部类有两种情况:(1) 在类中定义一个类(私有内部类,静态内部类)(2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中内部类的两个特点: (1) 在外部类的作用范围内可以任意创建内部类对象,即使内部类是私有的(私有内部类)。即内部类对包围它的外部类可见。转载 2015-07-02 18:14:37 · 556 阅读 · 0 评论 -
JAVA对象创建的过程(简单粗暴明了)
假设有个名为Cat类:1、即使没有显示地使用static关键字,构造器实际上也是静态方法。因此在创建类型为Cat的对象时,或者Cat类的静态方法/静态域被首次访问时(被引用),java解释器必须查找类途径(classpath上查找),以定位Cat.class文件。2,、然后类加载器载入Cat.class,有关静态初始化的所有动作都会执行。并且,静态初始化只在Class对象首次加载时进行一次原创 2015-07-02 01:28:15 · 1553 阅读 · 0 评论 -
关于乐观锁和悲观锁的介绍
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人原创 2015-06-19 18:50:59 · 947 阅读 · 0 评论 -
HTTP协议详解
一、什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。二、HTTP协议的版本 H转载 2015-05-15 17:08:34 · 405 阅读 · 0 评论 -
四种垃圾回收器的比较
说起垃圾回收,许多人都了解它的概念,也在日常的编程中有所应用。尽管如此,仍有许多我们不太了解的东西,而这正是痛苦的根源。关于JVM最大的误解就是认为它只有一个垃圾回收器,而事实上它有四个不同的回收器,每个都各有其长短。JVM并不会自动地选择某一个,这事还得落在你我的肩上,因为不同的回收器会带来吞吐量及应用的暂停时间的显著的差异。这四种回收算法的共同之处在于它们都是分代的,也就是说它们将托管的堆转载 2015-05-14 20:45:04 · 812 阅读 · 0 评论 -
Spring+hibernate整合
一、概述。一、概述。 Spring与Hibernate的集成在企业应用中是很常用的做法通过Spring和Hibernate的结合能提高我们代码的灵活性和开发效率,下面我就一步一步的给大家讲述Spring如何和Hibernate集成的。二、代码演示。导入Hibernate的jar包Hibernate-3.2/lib原创 2015-04-28 01:00:40 · 611 阅读 · 0 评论 -
java基础---J2EE十三个规范
J2EE十三个规范一、十三个规范总结二、API 1.JDBC JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。简单的说就是处理数据库的一个API库。 2. JNDI JNDI是一组在Java应用中访问命名和目录服务的API。命名服务将名称和转载 2015-04-27 16:44:06 · 443 阅读 · 0 评论 -
java基础---static关键字
一、概述 static 关键字是声明静态变量,静态方法用的。static的含义是属于类且不属于类对象的变量和函数。二、static的产生。 在创建对象的时候除非用new创建那个类的对象,否则实际上并没有获得任何对象只有当执行new来创建对象时数据存储空间才被分配,其方法才供外界调用。但是有两种情况上述方法时无法解决的第一种只想为某特定域分配单一存储空间而不原创 2015-04-27 16:39:41 · 449 阅读 · 0 评论 -
Java-面向对象
一、概述。 Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性:1)万物皆为对象。 2)程序是对象的集合。3)每个对象都有自己的由其他对象所构成的存储。4)每个对象都拥有其他类型。每个对象都是某个类的一个实例。5)某一特定类型的所有对象都可以接收同样的原创 2015-04-27 16:37:14 · 399 阅读 · 0 评论 -
TCP的三次连接和四次挥手
理解:窗口和滑动窗口TCP的流量控制TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的缓冲区尺寸剩余缓冲区空间的数量叫做窗口2. TCP的流控过程(滑动窗口)TCP(Transmission Control Protocol) 传输控制协议三次握手转载 2015-04-24 12:29:08 · 526 阅读 · 0 评论 -
TCP和UDP的区别
TCP(传输控制协议):1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;2)面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像转载 2015-04-24 09:11:46 · 414 阅读 · 0 评论 -
“==“与equal的比较。
“==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】 equal用于比较两个对象的值是否相同【不是比地址】 【特别注意】Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较原创 2015-04-21 15:29:27 · 494 阅读 · 0 评论 -
优快云的博客积分规则及博客排名规则
最近对优快云博客积分的计算规则比较疑惑,并看到优快云的一篇博客《csdn博客积分如何计算》:博客排行榜排名分值=个人Blog所有随笔与文章的阅读数之和+个人Blog所有评论数之和*10+个人所发表的评论数之和*50下面是是我整理的一些规则:优快云博客积分计算规则:1、每发布一篇原创或者翻译文章:可获得10分。2、每发布一篇转载文章:可获得2分。3、翻译 2015-04-19 12:31:14 · 608 阅读 · 0 评论 -
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
一、概述 PV操作是对信号量进行的操作。 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。举例:就像消费者与生产者的关系,说吃馒头把有一个碗能盛下6个馒头,厨师不停的生产馒头,顾客不停的吃馒头,此时厨师与顾客的关系就是同步。(如下图)转载 2015-04-19 11:18:04 · 675 阅读 · 0 评论 -
Synchronized的内存可见性
在Java中,我们都知道关键字synchronized可以用于实现线程间的互斥,但我们却常常忘记了它还有另外一个作用,那就是确保变量在内存的可见性 - 即当读写两个线程同时访问同一个变量时,synchronized用于确保写线程更新变量后,读线程再访问该 变量时可以读取到该变量最新的值。比如说下面的例子:public class NoVisibility { private s转载 2015-04-10 18:54:46 · 8478 阅读 · 7 评论 -
volatile和synchronized的区别:
关于可见性的问题:可见性:即当读写两个线程同时访问同一个变量时,用于确保写线程更新变量后,读线程再访问该 变量时可以读取到该变量最新的值。volatile和synchronized的区别:1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.vo原创 2015-04-10 18:13:00 · 600 阅读 · 0 评论 -
从Java代码到字节码
理解Java代码是如何被编译为字节码并在Java虚拟机(JVM)上执行是非常重要的,这将帮助理解你的程序是如何执行的。这样的理解不仅仅能够让你在逻辑上更好的掌握语言特性,而且能够有机会理解在做出重要决定时所需的权衡以及相应的副作用。这篇文章解释了Java代码是如何被编译为字节码并在JVM上执行的,如果想要理解JVM的内部结构和以及字节码在运行过程中占用的不同的内存区域,请看我之前的深入JV转载 2015-04-09 23:13:23 · 893 阅读 · 0 评论 -
Class.forName的作用以及为什么要用它
Class.forName(xxx.xx.xx) 返回的是一个类首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 A a = (A)Class.forName("pa转载 2015-04-09 09:16:15 · 387 阅读 · 0 评论 -
jvm 关于初始化时<cinit> , <init>的调用。
在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法, 另一个是实例的初始化方法:在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行:在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法原创 2015-04-07 17:11:33 · 2826 阅读 · 0 评论 -
java虚拟机中的方法区的作用
随着对java的进一步挖掘,深入到java虚拟机的时候,我才发现原来以前学的那些莫名其妙的方法终于有了合理的解释。比如main()?我们俗称为主函数,作为程序初始线程的七点,同时将告知虚拟机为列在常量池第一项的类分配足够的内存。属于非守护线程。守护线程通畅有虚拟机自己使用的线程,比如垃圾收集任务的线程。下面我们用一个例子来分析一下,一个程序的运行,背后的虚拟机是怎么作用的。clas原创 2015-03-31 23:04:08 · 1648 阅读 · 1 评论 -
深入理解Java String#intern() 内存模型
大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回。字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, 从Java7u40开始,该默认值增大到60013。在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间。下面,我们通过测转载 2015-03-22 22:10:00 · 624 阅读 · 0 评论