java中的getHostname

在linux服务器上,java程序有时会遇到unknown host name的问题。通过解决这些问题,我发现搞清楚jdk获取ip和hostname的方式以及linux机器的真实ip、hostname是关键。

linux上有很多常用命令会涉及,诸如:hostnamectl、nslookup、dig、ifconfig……下面我们先来看jdk如何获取hostname的

jdk提供的工具类

生产环境中,有时候会遇到一些性能异常,通过重启等临时方案可以暂时让程序继续跑下去,直到下次问题再出现。想要解决这些问题,必须能定位它的位置。而性能相关的代码,通常可能是锁竞争,线程池/连接池不过,full GC,过度吃cpu资源,死锁等,这些问题通常发生在特定环境中(比如有对资源的竞争),分析代码不能快速定位。这时就需要利用jdk提供的性能监控工具。

扩展spring的xml

spring框架在java世界应用广泛,IOC、AOP,包括最近的spring boot等,体系庞大。平时spring应用很少,也没特别的经验要说。但在适配自己的框架和spring方面,也摸索了几天,有了一点心得。所有的适配都是基于spring框架对外开放的钩子…今天要说的比较简单,是关于xml的

java中容易忽略的问题(一)

hashmap

java里的hashmap是单线程的,一般在多线程情况下,我们应该使用ConcurrentHashMap。因为在并发条件下,HashMap的误用可能不仅导致数据不一致性的问题,还有可能引发不可置信的死循环。当然,javadoc里已经明确告诫大家了:

1
Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map

这个问题是在rehash时候触发的循环链表造成的,之前sun对此的解释是请选择用ConcurrentHashMap

SimpleDateFormat

SimpleDateFormat是java中常用的时间format手段。它本身也不是线程安全的,在并发多线程条件下,比较好的做法应该是使用ThreadLocal或者每个线程创建属于自己的dateFormat。

1
2
Synchronization
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

java8中使用interface的default方法

最近遇到一个有趣的场景,简单描述如下:有一个interface Hello,带default实现的方法hello();想调用这个Hello.hello()

问题是调用实例方法是需要实体的,而仅有interface并不能构造一个实例。开始想通过字节码生成技术,发现困难挺多的,在不断尝试的过程中,发现了一个新的API:MethodHandle

javascript作用域

javascript的作用域和类C语言相比,有点特殊,对于初学者,容易搞错。所以要牢记javascript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

use liquibase

liquibase是一个开源的数据库迁移工具,它和rails世界中的migration比较接近,这对大型的j2ee项目开发来说,可谓是优质的辅助。对于一个健壮的j2ee平台而言,稳定的数据库系统是不可或缺的。之前在项目中通过人工的方式审核,并且有专门的数据导入导出环境。但是这样有很多不足,比如:对于一个数据库,我们无法知道哪些脚本执行过,我们也无法搞清楚当前数据库所处的版本(对应于代码流)。liquibase正好提供了一个解决思路。为了应对搭建数据库的不便,我们目前采用了InitialDB+liquibase的机制,这将极大地方便我们在不同的开发产品线之间切换。