小毛驴游戏工作室

Java游戏服务器开发、独立游戏开发者

深入分析String(三)

本章将深入分析在Java中最常用的String类,主要分析以下几个部分: String类的二大特点:不可变性和不可继承 关于String的使用和内存分配 String、StringBuffer和StringBuilder之间的关系和区别 一、String类的二大特点 1.1 不可变性 String对象是不可变的,进入到String源码中找到String构造函数会发现存储...

深入分析IntHashMap(二)

一、IntHashMap 1.1 准备 先从官网下载jar包:javasoft-collection.jar,解压后将jar包build到Java项目中. 1.2 IntHashMap类图 1.3 IntHashMap流程图 从上面类图可以看出IntHashMap和HashMap一样都是基于Map接口,在Map中最常用的2个方法是put()和get()方法。大家都知道...

深入分析final关键字(一)

Java的关键字final通常是指被它修饰的数据是不能被改变的,不想改变可能出于两种理由:设计或效率。以下是本文主要大纲: final数据的使用 final参数的使用 final方法的使用 final类不能被继承 一、final数据 1.1 final修饰变量 修饰的变量必须是基本数据类型:告知编译器这一块数据是不变的,这样可以在执行计算时,减少一些运行时的负...

深入分析Thread(六)

什么是线程安全性 如果一个类可以安全地被多个线程使用,它就是线程安全的。你无法对此论述提出任何争议,但也无法从中得到更多有意义的帮助。那么我们如何辨别线程安全与非线程安全的类?我们甚至又该如何理解“安全”呢?任何一个合理的“线程安全性”定义,其关键在于“正确性”的概念。在«Java并发编程实践»书中作者是这样定义的: 一个类是是线程安全的,是指在被多个线程访问时,类可以持续进行正确...

LinkedBlockingQueue源码分析(五)

#1.1 简介 LinkedBlockingQueue是一个由链表结构组成的有界阻塞队列,此队列是FIFO(先进先出)的顺序来访问的,它由队尾插入后再从队头取出或移除,其中队列的头部是在队列中时间最长的元素,队列的尾部是在队列中时间最短的元素。在LinkedBlockingQueue类中分别用2个不同的锁takeLock、putLock来保护队头和队尾操作。如下图所示: 1.2 类图...

Java阻塞队列(四)

一、什么是阻塞队列 1.1 简介 阻塞队列(BlockingQueue)是用于进程间通信或同一进程内的线程间通信的组件。它的工作原理是当队列是空的时,线程试图从队列中获取元素的操作将会被阻塞,或者当队列是满时,线程往队列里添加元素的操作会被阻塞。阻塞队列最常用于生产消费模式中,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。 1.2 常用操作方法 最近在看方腾飞的《Jav...

深入分析synchronized(三)

一、synchronized简介 Java提供了强制性的锁机制:synchronized,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问obje...

volatile可见性(二)

一、volatile简介 Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。 术语定义 ...

原子性(一)

原子性是指在同一时刻只有一个线程对它进行读写操作,避免多个线程在更改共享数据时出现数据的不准确。 先来看一个例子:使用程序实现一个计数器,期望得到的结果是100,代码如下: package com.lll.test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Ex...