线程与并发
文章平均质量分 81
喝酸奶舔盖儿的土鳖
事情都是有双面性的。
展开
-
Java线程(三)-线程栈模型与线程的变量
要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型。 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶。线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运行的时刻(实际上指代码运行到什么地方。 下面通过一个示例性的代码说明线程(调用)栈的变化过程: 这幅图描述在代码执行到两个不同时刻1、2时候,虚拟机线程调用栈示意图。 当程序执行到原创 2014-12-23 13:45:34 · 490 阅读 · 0 评论 -
Java多线程编程(四)-并发编程原理(操作系统篇)
在多线程、多处理器甚至是分布式环境的编程时代,并发是一个不可回避的问题,很多程序员一碰到并发二字头皮就发麻,也包括我。既然并发问题摆在面前一个到无法回避的坎,倒不如拥抱它,把它搞清楚,决心花一定的时间从操作系统底层原理到Java的基础编程再到分布式环境等几个方面深入探索并发问题。先就从原理开始吧。 并发产生的原因 虽然从直观效果上,处理器是并行处理多项任务,但本质上一个处理器在某个时转载 2014-12-30 11:12:32 · 532 阅读 · 0 评论 -
Java多线程编程(八)-并发编程原理(Java多线程开发技巧)
很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读《Java并发编程实践》了解到了很多不为我知但又非常重要的细节。 不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(...).start(),对于一般场景是没问题的转载 2014-12-30 16:24:34 · 521 阅读 · 0 评论 -
Java多线程编程(九)-并发编程原理(Java多线程性能优化)
大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大。下面列举一下可能会造成多线程性能问题的点: 死锁过多串行化过多锁竞争切换上下文内存同步 下面分别解析以上性能隐患 死锁 关于死锁,我们在学习操作系统的时候就知道它产生的原因和危害,这里就不从原理上去累述了,可以从下面的代码和图示重温一下死锁产生的原因: publ转载 2014-12-30 16:41:37 · 617 阅读 · 0 评论 -
Java多线程编程(六)-并发编程原理(Java存储模型和共享对象)
很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很理解,认为Java是一个屏蔽内存细节的平台,连对象回收都不需要关心,因此谈到可见性和安全发布大多不知所云。其实关键在于对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构。 Java存储模型原理 有很多书和文章都讲解过Java存储模型,其中一个图很清晰地说明了其转载 2014-12-30 11:36:04 · 451 阅读 · 0 评论 -
Java多线程编程(二)-并发编程原理(java虚拟机)
随着多核CPU的高速发展,为了充分利用硬件的计算资源,操作系统的并发多任务功能正变得越来越重要,但是CPU在进行计算时,还需要从内存读取输出,并将计算结果存放到内存中,然而由于CPU的运算速度比内存高几个数量级,CPU内的寄存器数量和容量有限,为了不让CPU长时间处于等待内存的空闲状态,在CPU和内存之间引入了速度接近CPU的高速缓存Cache作为CPU和内存之间的缓冲。计算机硬件并发的原转载 2014-12-29 15:44:44 · 537 阅读 · 0 评论 -
Java线程(一)-概念与原理
一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的原创 2014-12-23 13:23:32 · 458 阅读 · 0 评论 -
Java线程(二)-创建与启动
一、定义线程 1、扩展java.lang.Thread类。 此类中有个run()方法,应该注意其用法:public void run(){} 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 Thread 的子类应该重写该方法。 2、实现java.lang.Runnable接口。 使用原创 2014-12-23 13:31:49 · 572 阅读 · 0 评论 -
JAVA多线程和并发基础面试问答
原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:非常赞同这个观点) Ja转载 2014-12-31 14:22:58 · 484 阅读 · 0 评论 -
Java线程面试题 Top 50
原文链接:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型转载 2014-12-31 12:08:49 · 528 阅读 · 0 评论 -
Java锁机制(二)-锁的实现
前一篇文章讲到了Java中锁的原理,这一篇讲锁的实现过程。 一、java.util.concurrent.locks包下常用的类 下面我们就来探讨一下java.util.concurrent.locks包中常用的类和接口。 1.Lock 首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口。 package com.lock; import java.util.co原创 2015-01-03 21:47:53 · 534 阅读 · 0 评论 -
线程池的介绍及简单实现
服务器程序利用线程技术响应客户请求已经司空见惯,可能您认为这样做效率已经很高,但您有没有想过优化一下使用线程的方法。该文章将向您介绍服务器程序如何利用线程池来优化性能并提供一个简单的线程池实现。 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行转载 2015-01-04 15:13:59 · 675 阅读 · 0 评论 -
Java线程(六)-线程的交互
一、线程交互的基础知识 void notify() 唤醒在此对象监视器上等待的单个线程。 void notifyAll() 唤醒在此对象监视器上等待的所有线程。 void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 当然,wait()还有另外两个重载方法: void wait(long timeout原创 2014-12-24 15:31:12 · 450 阅读 · 0 评论 -
线程安全问题
public class Point{ public int x,y; public Point(int x, int y){ x=0; y=0; } public Point(Point p){ this.x=p.x;原创 2014-12-05 20:33:49 · 477 阅读 · 0 评论 -
Java线程(四)-线程状态的转换
一、线程状态 线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是创建、销毁、可运行、运行、等待/阻塞。用一个图来描述如下: 1、创建状态:线程对象已经创建,还没有在其上调用start()方法。 2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状原创 2014-12-23 22:09:08 · 633 阅读 · 0 评论 -
Java线程(七)-线程的调度
一、休眠 Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。 这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。 线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。 线程休眠的原创 2014-12-24 15:46:01 · 398 阅读 · 0 评论 -
Java线程(五)-线程的同步与锁
一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。 public class Foo { private int x = 100; public int getX() { return x; }原创 2014-12-23 22:27:49 · 467 阅读 · 0 评论 -
Java线程(九)-生产者消费者模型
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。 实际上,准确说应该是“生产者-消费者-仓库-产品”模型,四者缺一不可。对于此模型,他们之间的关系应该明确以下几点: (01) 生产者仅仅在仓库未满时候生产,仓满则停止生产。 (02) 消费者仅仅在仓库有产品时候才能消费,仓空则等待。 (03)原创 2014-12-26 13:19:00 · 563 阅读 · 0 评论 -
Java线程(十)-死锁
如果服务器当机或应用程序运行得如蜗牛,其中可能原因之一是被称为死锁线程问题。线程死锁就是一直处于堵塞BLOCKED 状态。 什么是死锁?两个线程A和B,那么死锁发生时,一般是两个对象的锁相互等待造成的。 线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。 下面看个死锁的例子: package com.thread; /** * Java线原创 2014-12-26 13:55:47 · 496 阅读 · 0 评论 -
Java线程(八)-线程的同步
一、同步方法 线程的同步是保证多线程安全访问竞争资源的一种手段。 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题? 对于同步,在具体的Java代码中需要完成以下两个操作: 把竞争访问的资源标识为private; 同步哪些修改变量的原创 2014-12-24 16:50:36 · 414 阅读 · 0 评论 -
Java多线程编程(一)-多线程编程设计要点
1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分别在JVM的stack区和heap区。 2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态,'Ready' 表示线程正在等待CPU分配允许运行的时间。 3.线程转载 2014-12-26 15:23:03 · 491 阅读 · 0 评论 -
Java多线程编程(七)-并发编程原理(Java并发工具)
基于线程安全的一些原则来编程当然可以避免并发问题,但不是所有人都能写出高质量的线程安全的代码,并且如果代码里到处都是线程安全的控制也极大地影响了代码可读性和可维护性。因此,Java平台为了解决这个问题,提供了很多线程安全的类和并发工具,通过这些类和工具就能更简便地写线程安全的代码。归纳一下有以下几种: 同步容器类并发容器类生产者和消费者模式阻塞和可中断方法Synchr转载 2014-12-30 16:01:04 · 458 阅读 · 0 评论 -
Java多线程编程(十)-并发编程原理(分布式环境中并发问题)
在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理: 避免并发时间戳串行化数据库行锁统一触发途径 避免并发 在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外转载 2014-12-30 17:26:12 · 3620 阅读 · 0 评论 -
Java多线程编程(三)-并发编程原理(java虚拟机序)
Java的并发编程是依赖虚拟机内存模型的三个特性实现的: (1).原子性(Atomicity): 原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的。 Java内存模型中通过read、load、assign、use、store和write这6个操作保证变量的原子性操作。 long和double这两个64位长度的数据类型java虚拟机转载 2014-12-29 15:46:47 · 461 阅读 · 0 评论 -
Java多线程编程(五)-并发编程原理(写线程安全的Java代码)
在写Java程序的时候,何时需要进行并发控制,关键在于判断这段程序或这个类是否是线程安全的。 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步,这个类的行为仍然是正确的,那么称这个类是线程安全的。我们设计类就是要在有潜在并发问题存在情况下,设计线程安全的类。线程安全的类可以通过以下手段来满足: 不跨线程共享变量使状态变量为不可变的在任何访转载 2014-12-30 11:31:53 · 490 阅读 · 0 评论 -
Java锁机制(一)-Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制
原文地址:http://www.ibm.com/developerworks/java/library/j-jtp10264/?S_TACT=105AGX52&S_CMP=cn-a-j 新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronized JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择。例如, java.u转载 2015-01-03 20:34:34 · 463 阅读 · 0 评论