Archive | java RSS feed for this section

Sort源码实现比较Go&Java语言风格(3)

前面两部分分别描述了Gojava两种语言对sort的使用方式和源码实现。作为go初学者,最想做的是通过例子和源码来对新的语言有个理解。这部分就结合自己的理解整理下,可以看到,是非常主观。
4 语言语法比较
可以看到,两种语言的思路基本上是一样的,用户必须定义比较规则。在排序过程中都要考察集合长度,使用用户定义的比较规则,然后调整元素位置来达到排序的效果,对应go的interface要求的三个方法。但是还是有挺多不同。
首先从使用方式上看,go的规则(通过方法来体现)定义在集合上,并且定义了三个方法,分别获取集合的状况,元素比较的规则,元素位置操作的方法;而java的规则定义在元素上,用户只用一个元素比较的规则compareTo?就够了。看起来java要求用户定义少,因为其封装的多,这也是其一贯的风格。对用户要似乎更友好一点。比较而言go更直接,简单。留给程序员能干预的更多一点。但还[......]

阅读全文

Tags: , , ,

Comments { 1 }

Sort源码实现比较Go&Java语言风格(2)

上篇博文,工作中用到了go排序的功能,作为go新手,在参照着例子,并读了go的sort.go部分涉及的源码,了解了go中排序的细节和实现算法,这些在上篇博文中有介绍。作为一个java ZHONGDU*2的用户,不由自主的想到了java中对应实现的样子,在这里也非常简要的贴出来,描述下java中排序的用法,和java源码中对应部分的实现,比较好奇java是和go一样,也用的时候快速排序吗?

3 Java 排序源码解析

主要代码Looks like this:
3.1 使用例子

和go中不同,必须要在class的第一行implements Comparable这个接口,然后在实现这个接口中定义的compareTo方法,告诉接口到底元素是怎么比较大小的。于是这也追踪下Collections.sort()方法中是如何使用[......]

阅读全文

Tags: , ,

Comments { 1 }

Sort源码实现比较Go&Java语言风格(1)

1 前言

刚开始拥抱go,非常新鲜!才使用没多久,属于没有经验,有一点感受的那种。具体也说不了特别清楚,就是觉得:简单,直接,灵活,方便。作为一个 java 重度中毒(ZHANGDU*2)用户,过程中还是习惯对照着思考,至少在这个阶段。也好,发现对照着想,似乎更容易融会贯通。 对资深的go程序员来说,应该都是非常基础基本的问题,但也挡不住咱这个小白要发表下感想。
第一篇文章首先结合最近做一个小feature时用到go中元素排序的功能,顺便了解下两种语言中排序功能的使用方式,各自源码中对排序功能的实现。当然最主要的是在这个过程中,作为go初学者对语言的体会和理解。

2 Go排序源码解析

现在一般不太会自己写排序算法的实现了,就去搜go的package?, 如愿找到了package sort?,和猜想的接口差不多,有一个func Sort(data Interface) 。只要把待排序[......]

阅读全文

Tags: , , , ,

Comments { 1 }

Java 并发之内存模型整理

一、概述

Java线程之间的通信由Java内存模型JMM控制,[highlight]JMM决定一个线程对共享变量的写入何时对另一个线程可见[/highlight]。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下:

jmm2

从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤:

  1. 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。
  2. 然后,线程B到主内存中去读取线程A之前已更新过的共享变量。

在线程运行的时候有一个内存专用的一小块内存,当[......]

阅读全文

Tags: , , ,

Comments { 0 }

java 垃圾回收策略

尝试介绍几种常用的垃圾回收算法,根据年轻代、年老的的特征分别使用不同的收集算法。以及考虑到垃圾收集的吞吐量、暂停时间等采用不同的收集选项。

垃圾回收算法

收集算法主要有引用计数(reference counting)和引用追踪(tracing collector),从名字上不难理解一个就是数对象引用数,没用了则清楚,引用追踪则是产看对象是否从活的“跟对象”(“跟对象”见本文下面介绍)关联出来。收集器从根开始访问每一个活跃的节点,标记它所访问的每一个节点。走过所有引用后,收集就完成了,然后就对堆进行清除(即对堆中的每一个对象进行检查),所有没有标记的对象都作为垃圾回收并返回空闲列表。

根据算法的细节引用追踪又分为标记清除、复制、标记整理三类。

tracing-collector

引用计数(Reference?Counting

比较简单直接。最好理解最容易想到的一种策略。原理是此对象有一个引用,即增加[......]

阅读全文

Tags: ,

Comments { 2 }