Sevenvoid's Blog


  • 首页

  • 分类

  • 归档

  • 标签

  • 公益404

Java并发编程系列(三):回归线程本质

发表于 2016-11-27   |   分类于 并发编程   |  

上一篇文章开篇就讲了用synchronized实现的并发访问的同步方式与原理,这篇探本溯源来看看与线程以及并发相关的最基础的东西。

进程与线程

现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是指正在运行的程序,是一个独立的运行环境,它是系统进行资源分配和调度的一个独立单位,进程被创建时,会获得独立的内存单元,且进程与进程之间用户不能直接访问。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量,它是进程调度的基本单位。例如:启动一个Java程序时,进入该程序的main方法时,系统就会创建一个相应的线程。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。

线程的实现

并发不一定要依赖多线程( 如PHP中很常见的多进程并发) , 但是在Java里面谈论并发, 大多数都与线程脱不开关系。那么线程是如何具体实现的呢?

OS层实现

线程是比进程更轻量级的调度执行单位, 线程的引入, 可以把一个进程的资源分配和执行调度分开, 各个线程既可以共享进程资源( 内存地址、 文件I/O等) , 又可以独立调度( 线程是CPU调度的基本单位) 。在OS层面,实现线程主要有3种方式: 使用内核线程实现、 使用用户线程实现和使用用户线程加轻量级进程混合实现。

阅读全文 »

Java并发编程系列(二):深入理解synchronized

发表于 2016-11-22   |   分类于 并发编程   |  

由单例模式的延伸,再来看一下synchronize的奥秘

synchronized 使用

最开始我们接触Java并发编程的时候,就知道如果想要实现同步,synchronized一直是元老级角色,synchronized是Java中的关键字,是一种同步锁,而Java中的每一个对象都可以作为锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象,一般同静态的方法一起考虑。

结合上面的修饰类型它又有如下的特性:

  1. 当修饰一个代码块或者方法时,不同的对象锁(即一个对象的不同实例)的执行是互相不影响的,同一对象锁的多线程只能同步阻塞执行;
  2. 当访问一个对象的非同步方法时,不需要获取对象锁,也即不会被阻塞执行;
  3. 一个静态方法的对象锁是该类的Class对象,因此一个类的不同实例都具有同样的锁对象,对同步方法的执行均需要同步阻塞。
    阅读全文 »

Java并发编程系列(一):Singleton血案

发表于 2016-11-20   |   分类于 并发编程   |  

很早以前就想认认真真的学习、吃透Java编程方面的各种原理,并且积累一些经验,一是想要技术更上一层楼,二也是想要找到一个自己想要探索的方向。在自己的认知上,一直认为吃透了基础,才可以选择远方。 ——题记

从本文开始将会详细了解一下Java并发编程方法的相关知识,内容的来源可能是自己看书、或者网上的优秀博文,文末都会有相关的参考链接,详细内容可以访问原文。好记性不如烂笔头,自己暂时写不好一篇文章,那么试着整理也是一件不可多得的事情,至少认真思考了,也实践了一遍。本文将从一个单例模式开始,看下如何编写正确的并发代码。

Singleton的习惯使用

Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,在Java编程中,对于单例模式,程序员一般习惯会写成如下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package edu.sevenvoid.jvm.thread;
/**
* @author sevenvoid
*
* 2016年12月4日
*/
public class SingletonTest {

private static SingletonTest instance = null;

private SingletonTest() {
//为了说明并发问题,打印对象创建时的线程名
System.out.println("The current thread is : " + Thread.currentThread().getName()); //
}
public static SingletonTest getInstance() {
if(instance == null) { //1:A线程执行
instance = new SingletonTest(); //2:B线程执行
}
return instance;
}

public static void main(String[] args) {
for(int i=0; i<=5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
SingletonTest.getInstance();
}
});
thread.start();
}
}
}

阅读全文 »
12
Sevenvoid

Sevenvoid

一只迷茫的猫

13 日志
6 分类
23 标签
© 2016 - 2018 Sevenvoid
版权归 Sevenvoid 所有
主题 - NexT.Pisces