0%

前言

其实之前也有看过HashMap的源码,觉得自己对其中的实现原理什么的都还算是比较了解了。其实当初看的时候就没有看的多仔细,只是应付面试的问题罢了。 这不,最近有人提出个问题自救就没法回答了。

问: 我们知道,初始化 HashMap 的时候,可以使用默认的构造函数,也可以使用一个带 initialCapacity 参数的构造函数用于构造一个已知大小的实例。这样可以减少扩容时的数据转移等操作从而提高性能,那么已知需要存1000个数据,初始的 initialCapacity 应该是多少?

听到这问题的时候,脑海中大致知道有个扩容之类的与之相关,但是具体的却是不记得了,很是尴尬。所以接下来就回去再次详细的看了看 HashMap 的源码,这里作为记录,在下面的内容中会涉及解惑该问题。

注: 此篇文章的分析是基于JDK7的


阅读全文 »

说起JAVA并发编程,就不得不聊聊CAS(Compare And Swap)和AQS了(AbstractQueuedSynchronizer)。


CAS(Compare And Swap)

什么是CAS

CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

在JAVA中,sun.misc.Unsafe 类提供了硬件级别的原子操作来实现这个CAS。 java.util.concurrent 包下的大量类都使用了这个 Unsafe.java 类的CAS操作。至于 Unsafe.java 的具体实现这里就不讨论了。

阅读全文 »

前言

Java多线程编程中,保证线程安全通常会使用到synchronizedLock。那么合适该使用synchronized,什么时候该使用Lock呢。这个就需要我们对synchronizedLock有个清晰的了解。


Locksynchronized

synchronized 是JAVA提供的强制原子性的内置锁机制。一个synchronized有两部分:锁对象的引用 (synchronized 方法的锁,就是该方法所在对象本身),以及这个锁保护的代码块。每个Java对象都可以作为一个用于同步的锁的角色,这些内置的锁被成为内部锁,线程进入 synchronized 块之前会自动获得锁,退出、报错异常、时会释放锁。内部锁是一种互斥锁,这就是说,至多只有一个线程可以获得锁,所以被 synchronized 声明的方法或代码块至多只有一个线程可以进入。从而保证了线程安全。 大致有如下用法:

1
2
3
4
5
6
7
8
9
//作用于方法
public synchronized void synchronizedMethod(){
//do something
}

// 作用与代码块
synchronized (syncObj){
//do something
}
阅读全文 »

Github Pages和Hexo介绍

Github PagesGithub 推出的一个福利。可以在上面构建个人页面。**Hexo** 就是一个快速、简洁且高效的博客框架(官网上是这么说的,hhh),并且支持一键部署到github。可以用它来构建自己的个人博客,当hexo遇到Github pages时,我们就不需要自己的一个服务器就可以搭建一个个人博客网站了。下面开始讲搭建过程。

阅读全文 »

市盈率(PE): 市盈率是上市公司股价与每股收益(年)的比值。即:市盈率=股价/每股收益(年)。明显地,这是一个衡量上市公司股票的价格与价值的比例指标。可以简单地认为,市盈率高的股票,其价格与价值的背离程度就越高。也就是说市盈率越低,其股票越具有投资价值。

空头行情/多头行情: 股价长期保持上涨势头的股票行情称为多头行情。多头行情股价变化的主要特征是一连串的大涨小跌。 股价长期呈下跌趋势的股票行情称为空头行情,空头行情股价变化的特征是一连串的大跌小涨。 多头是指投资者对股市看好,预计股价将会看涨,于是趁低价时买进股票,待股票上涨至某一价位时再卖出,以获取差额收益。 空头是投资者和股票商认为现时股价虽然较高,对股市前景看坏,预计股价将会下跌,于是把借来的股票及时卖出,待股价跌至某一价位时再买进,以获取差额收益。采用这种先卖出后买进、从中赚取差价的交易方式称为空头。

未完待续