`
eric_weitm
  • 浏览: 242771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程编程和java的抽象

 
阅读更多

java线程状态http://my.oschina.net/mingdongcheng/blog/139263

死锁:彼此都在等对方释放的锁,结果永远等下去

阻塞:因为缺少某个条件,导致让出了cpu,并且不再是就绪状态。

类型分为等待阻塞(o.wait)对应waitting queue、同步阻塞(lock)对应lock pool、其他阻塞(sleep、join、同步IO,满足后自动变成就绪)

 

一、OS的封装

        OS支持进程,支持cpu调度,所以多进程的同步由OS来实现(比如进程堵在磁盘访问的队列上),

但是同一个进程内的多线程,属于应用的范畴,所以需要程序员自己来实现

二、Linux对多线程的支持

        linux没有单独实现线程,而是直接使用轻量级进程来模拟的(实现了pthread的语义),利用copyOnWrite来提高效率,这样进程间通信的方式,可以用在线程同步。linux内核提供的同步的工具包括:

1、原子操作 2、自旋锁(spin lock)循环询问和等待(避免被换出和换入打破cache等优化)3、mutex 4、readWriteLock  5、condition 6、semaphore

三、pthread

        POSIX threads 是类unix操作系统的多线程标准API(windows有移植版本),提供的同步方式包括 Mutex、condition、semaphore

1、Mutex 保护的区域(代码片段),一次只会进入一个线程(面向过程),相关api是lock, unlock

2、condition 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。这种环境下 条件本身同时被多个线程访问,所以需要加锁保护条件。线程在改变条件状态前先要锁住互斥量。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步。条件变量要和互斥量相联结,以避免出现条件竞争--一个线程预备等待一个条件变量,当它在真正进入等待之前,另一个线程恰好触发了该条件。(目的是等到后再执行,现在则永远等不到信号)

wait(线程释放mutex,被挂起到等待队列,不再占用cpu,被signal唤起前,会自动加锁;前面的过程自动进行) 

signal 唤醒同一个condition上wait的线程

3、semaphore 相当于封装了mutex+condition,且支持多个条件值(不需要同步),相关api wait post

 

四、java的封装

        java对并发的封装有几个层次,包括 

1、基础的lock、condition、原子操作,分别在java.util.concurrent.locks和java.util.concurrent.atomic

2、Thread类,syncronized(悲观锁,阻塞) volatile(修改的可见性) 等关键字

3、并发的数据结构,阻塞队列、线程池、信号量等并发的组件(java.util.concurrent)

4、Thread类中几个方法的含义

join 获得某个线程的锁,之后wait,所以可以实现前一个线程结束后才执行下一个

wait(属于Object) 阻塞到当前对象,释放当前Object上的锁

static void yield() 暂停当前正在执行的线程对象,并执行其他线程。不释放锁

static void sleep(long millisec) 让出cpu,不释放锁

5、实际中需要注意的

syncronized太消极,考虑用原子类型、读写锁等来代替

注意减少锁住的粒度,考虑使用ConcurrentHashMap等数据结构

考虑使用不基于锁的同步机制(硬件的指令支持)

 

五、syncronized封装的隐式锁与显示的Lock的区别(后者更灵活,进而在特定情况下更高效,缺点是使用复杂)

1、可中断申请 2、尝试型申请 3、可以插队提高吞吐率 4、可以精确唤醒(signal)

 

分享到:
评论

相关推荐

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    Java多线程编程总结.doc

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升软件的效率和响应性。本文档详细介绍了Java中的线程概念、原理以及如何在Java中创建和启动线程。 首先,线程是操作系统实现多任务处理...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java多线程编程实战指南+设计模式篇(全部)

    此外,线程池(如`ThreadPoolExecutor`)是Java多线程编程中的重要概念,它能够管理和控制线程的生命周期,提高系统性能并减少资源消耗。合理配置线程池参数,如核心线程数、最大线程数和工作队列容量,对于优化系统...

    java多线程编程

    ### Java多线程编程知识点详解 #### 一、Java多线程编程的优越性 Java的多线程编程相比C或C++具有显著优势,主要归功于Java语言级的原生支持。Java的设计者们深刻理解到多线程对于现代软件开发的重要性,因此将...

    Java多线程编程实战指南+设计模式篇

    本资源“Java多线程编程实战指南+设计模式篇”深入探讨了这两个主题,旨在帮助开发者提升其在并发编程和软件设计上的技能。 **一、Java多线程** 1. **线程基础**:Java中的线程是程序执行的最小单位。Java通过`...

    Java多线程编程.pdf

    Java多线程编程是Java开发中的重要组成部分,尤其在应对并发和高并发场景时不可或缺。在Java中,线程是一个程序执行的独立路径,允许程序同时执行多个任务。线程的概念虽然抽象,但理解它是理解Java并发编程的关键。...

    Java多线程编程总结

    Java多线程编程的核心在于理解和利用操作系统中的线程和进程概念。**进程**是系统进行资源分配和调度的基本单位,每个进程拥有独立的内存空间。而**线程**则是进程中的执行流程,它们共享所属进程的内存资源,这使得...

    Java多线程编程知识.pdf

    Java多线程编程是Java开发中的重要组成部分,它涉及到如何在单个程序中同时执行多个任务,从而提高程序的效率和响应性。线程在操作系统层面上是一个抽象的概念,Java平台利用操作系统提供的线程机制来实现其自身的...

    JAVA多线程编程集合.pdf

    Java多线程编程是指在Java语言中实现多线程机制,以便让程序同时执行多个任务,提高程序的执行效率和响应速度。Java提供了两种创建线程的方式:实现Runnable接口和继承Thread类。以下是详细介绍: 1. Java多线程的...

    java基础部分的笔记,包含抽象,特征,映射,流,线程,反射等

    线程间通信和同步是多线程编程中的重要课题,Java提供了`synchronized`, `wait()`, `notify()`等机制来解决这些问题。 6. **反射**:Java的反射机制允许程序在运行时动态地获取类的信息并操作类的对象。通过`Class`...

    JAVA-JavaThreadProgramming-Sams.zip_JAVA 设计_java 多线程_java 线程_多线程

    总之,Java多线程编程涉及到的概念和技巧广泛,理解并掌握这些知识对于任何Java开发者来说都至关重要,无论是在桌面应用、服务器端开发还是移动应用领域。通过学习本资料,开发者可以深入理解如何在Java中有效地利用...

    java 多线程 队列工厂

    Java通过`Thread`类和`Runnable`接口支持多线程编程。创建新线程主要有两种方式: - 继承`Thread`类:创建一个新的类,继承`Thread`,然后重写`run()`方法。创建该类的实例并调用`start()`来启动线程。 - 实现`...

    多线程两种实现方式Java

    在Java编程语言中,多线程是并发执行多个任务或代码段的重要机制。这使得程序能够同时处理不同的任务,提高系统资源的利用率和程序的响应速度。本篇将详细讲解Java中实现多线程的两种主要方法:继承Thread类和实现...

    实现多线程编程.rar

    本资源"实现多线程编程.rar"显然是针对Java、C语言、C++、C以及JSP开发者的一份珍贵内部资料,它涵盖了多线程编程的核心概念和实践技巧。 1. **多线程定义**:多线程是指一个程序中可以同时执行多个线程(或称为轻...

    java多线程和定时器学习

    Java多线程与定时器是Java编程中两个重要的概念,它们在构建高性能、高并发的应用程序中发挥着关键作用。本文将深入探讨这两个主题,并结合实际的代码示例进行讲解。 首先,我们来理解Java多线程。多线程允许一个...

    Java多线程编程,生命游戏,用线程池.zip

    在本项目中,我们主要探讨的是使用Java进行多线程编程来实现一款名为"生命游戏"(Conway's Game of Life)的小游戏。生命游戏是由数学家约翰·康威提出的一种模拟生物演化的抽象模型,它通过简单的规则展示出复杂的...

    基于Java的多线程网络爬虫设计与实现.txt

    Java作为一种跨平台的面向对象编程语言,因其强大的类库支持和多线程处理能力,在开发网络爬虫方面具有显著优势。多线程技术允许爬虫同时处理多个网页请求,极大提升了爬取效率和系统响应速度。 ##### 网页抓取与...

    Android开发中的多线程编程技术

    然而,多线程编程因其复杂性和抽象性常常让开发者望而却步。本文将详细介绍Android中的多线程编程技术,并通过一个具体的案例——计时器程序,来帮助读者理解如何有效地使用多线程。 #### 二、多线程基础知识 ####...

Global site tag (gtag.js) - Google Analytics