现在,通过前几篇的总结,我们对Java多线程已经有所了解了,但是都是一些Java并发程序设计基础的底层构建块。对于实际编程来说,我们应该尽可能的远离底层结构。使用那些由并发处理的专业人士实现的较高层次的结构要方便的多,安全的多。
阻塞队列
对于许多线程问题。可以通过使用一个或多个队列以优雅且安全的方式将其形式化。生产者线程向队列插入元素,消费者线程则取出他们。使用队列,可以安全...
分类:
编程语言 时间:
2015-02-03 23:08:11
阅读次数:
489
好久没有更博客了,最近一直在忙工作的事情。现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉。
关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程有什么优势,线程和进程有什么区别呢?了解过大致的线程内容后,就应该编码来实现Java的多线程了。首先2种方式来创建线程类,然后调用对应的API来控制线程。然后还剩下一个最大的也是最重要的一块...
分类:
编程语言 时间:
2015-02-03 17:15:07
阅读次数:
176
现在有这样一个任务,有一份手机号列表(20W),有一份话单的列表(10W),要统计哪些手机号没有出现在话单中,哪些手机号在话单中出现了不止一次。
想到的最直接的方式,就是两层循环去遍历,虽然此方法比较笨,但目前还没有想出更好的办法。
一开始使用单线程来处理,代码是随手写的并没有进行重构,只是做一个简单的说明:
package tool;
import java.util.List;
pu...
分类:
编程语言 时间:
2015-02-03 01:55:28
阅读次数:
250
我们学习线程安全与同步的知识目的就是要实现一些可复用组件或编写出更大的程序。
java中类是对象抽象,那么怎么实现一个线程安全类是我们必须要知道的并正确使用的技术。
在设计线程安全类的过程中,需要包含以下三个基本元素:
找出构成对象状态的所有变量。
找出约束状态变量的不变性条件。
建立对象状态的并发访问管理策略。
package com.hom...
分类:
编程语言 时间:
2015-02-03 00:42:52
阅读次数:
119
我们前面所讲的一切其实都只是为了一个目标那就是能正确发布一个线程安全的对象。
一:线程封闭
这个很好理解如果一个变量是在一个线程中完成的状态改变,那么这个变量肯定是线程安全的。
我们常使用的是栈封闭和ThreadLocal类。
在java运行时内存区中有一个虚拟机栈,栈封闭说的就是这个栈,这个栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述描述的是java方法执行的内存模型:每个方法被...
分类:
编程语言 时间:
2015-02-02 07:10:09
阅读次数:
215
同步机制可以保证原子操作和内存可见性,但是同步机制对变量的访问性能是我们不得不考虑的问题,java语言提供了一种弱同步机制,volatile变量。
它的原理大致是这样的,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的...
分类:
编程语言 时间:
2015-02-01 23:21:33
阅读次数:
316
前三篇我们主要说了多线程访问共享可变状态时需要进行正确的同步处理,保证同一时刻只有一个线程访问相同的数据,我们使用synchronized关键字来实现原子性操作。今天我们在来认识一下同步的另一个重要方面:内存可见性,这个概念其实很好理解,就是保证在同一个时刻,共享可变状态对访问它的线程呈现出自己最新的状态变化。
我们经常遇到的情景是这样的,一个全局变量计数器,一个线程负责更新该数值,另一些线程获...
分类:
编程语言 时间:
2015-02-01 16:12:17
阅读次数:
240
一、操作系统中线程和进程的概念现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个...
分类:
编程语言 时间:
2015-01-31 19:22:07
阅读次数:
218
(一)volatile的使用
1、使用场景
(1)状态标识。用于实时指示某个重要性事件的发生,比如完成初始化或者停机。
volatile boolean toShutdown;
......
public void shutdown() { toShutdown = true; }
public void doWork() {
while (!...
分类:
编程语言 时间:
2015-01-31 09:27:55
阅读次数:
195
单线程环境下可以使用HashMap和TreeMap。如果不是遍历时需要按照Key的排序来返回结果,应该采用HashMap。
多线程环境下可以使用以下四种Map容器。
1)Collections.synchronizedMap(new HashMap());
2)ConcurrentHashMap
3)Collections.synchronizedSortedMap(new TreeMap())
4)ConcurrentSkipListMap
如果不需要遍历时需要按照Key的排序来返回结果,首选Concur...
分类:
编程语言 时间:
2015-01-30 17:41:51
阅读次数:
536