Java 线程状态之 BLOCKED

摘要: 深入探讨了 Java 线程的 BLOCKED 状态, 特别是对 enter 及 reenter 两种情形进行了深入分析.

上一篇章 中, 我们强调了 BLOCKED 状态跟 I/O 的阻塞是不同的, 它不是一般意义上的阻塞, 而是特指被 synchronized 块阻塞, 即是跟线程同步有关的一个状态.

BLOCKED 状态的定义

前面 已经说过 BLOCKED(阻塞) 的简单定义为:

一个正在阻塞等待一个监视器锁的线程处于这一状态. (A thread that is blocked waiting for a monitor lock is in this state.)

更加详细的定义可以参考 Thread.State 中的 javadoc:

/**
 * Thread state for a thread blocked waiting for a monitor lock.
 * A thread in the blocked state is waiting for a monitor lock
 * to enter a synchronized block/method or
 * reenter a synchronized block/method after calling
 * {@link Object#wait() Object.wait}.
 */
BLOCKED,

继续阅读

Java 线程状态之 RUNNABLE

摘要: 深入探讨了 Java 线程的 RUNNABLE 状态, 特别是对处在 IO 阻塞时的状态进行了深入分析.

上一篇 我们粗略谈到了 Java 的 6 种线程状态, 并对其中较为简单的 NEW 和 TERMINATED 做了分析, 现在我们具体来看下 State.RUNNABLE 状态, 即所谓的可运行状态. (以下简称 runnable)

再次强调, 这里谈论的是 Java 虚拟机层面所暴露给我们的状态, 与操作系统底层的线程状态是两个不同层面的事.

具体而言, 这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:

java Thread.State 线程枚举状态

继续阅读

文本在内存中的字符集编码(3)--String 的转换--乱码探源(6)

摘要: 探讨了 String 到 byte[] 的转换, 并结合之前的 new String 作了综合分析.

先讲个小故事, 虽然跟主题有点不太相关哈:

唐朝诗人李绅, 身为官员, 脾气暴躁, 瞧不起信教的, 尤其鄙视装逼之僧人, 动不动就对他们拳脚相加. 曾扬言: "我可以接见他们, 要能答出来还好, 要是答不出来, 我弄死他!" 有一回一个和尚来跟他宣传因果报应, 李绅问: "阿师从哪里来, 到哪里去呢?" 僧答: "贫僧从来处来, 到去处去." 李绅当时就急了, 撸起袖子, 亮出了手腕: "我去年买了个表!"

来自知乎问答"古人是如何「装逼」的? ", 略有改动.

String 到哪里去?

有了前面僧人的教训, 在这里就不故弄玄虚了, 应该说 String 的去处还是蛮确定的, 那就是到 byte[] 中去, 方式就是通过 getBytes 这一方法.

new String 与 getBytes

如果说 new String(byte[], encoding) 是从 byte[] 到 String 的过程, 那么 getBytes(encoding) 则正好与之相反: 它是从 String 到 byte[] 的过程.

string and getbytes conversion

或许我们应该说: 它从去处来, 又到来处去.

继续阅读

文本在内存中的字符集编码(2)--String 的构造--乱码探源(5)

摘要: 深入探讨了 String 的构造, 编码间的转换以及字节流, 字符流等.

在前面我们探讨了 String 是什么的问题, 现在来看 String 从哪来的问题.

String 从哪里来?

所谓从哪里来也可以看作是 String 的构造问题, 因此我们会从 String 的构造函数说起.

String 的构造函数

在前面我们知道 String 的内部就是 char[], 因此它可以根据一组 char[] 来构建, String 中有这样的构造函数:

public String(char value[]) {}

继续阅读

文本在内存中的字符集编码(1)--String 的本质--乱码探源(4)

摘要: 文本在内存中的编码以及 String 类型的本质.

让我们从一个故事开始说起. 话说北大是很有哲学传统的, 当你准备踏进北大校门时, 连门卫都会连问你三个终极哲学问题:

你是谁? 你从哪里来? 你要到哪里去?

那么这与我们的问题又有何关系呢? 我觉得理解内存中的编码的关键在于理解 String 类型, 因此我们也来探讨一下 String 的前世今生:

  • String 是谁(什么)?
  • String 从哪里来?
  • String 到哪里去?

当我们能够清晰地回答这三个终极问题时, 对文本在内存中的编码也算理解得差不多了.

注: 文中将用 Java 平台为例来探讨这些问题.

继续阅读