`
kaihuigy
  • 浏览: 5158 次
社区版块
存档分类
最新评论

Java 多线程的基本概念

阅读更多

线程安全性

要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是共享的和可变状态的访问。

Java的主要同步机制是关键字synchronized,它提供乐一种独占的加锁方式,意味着只有一个线程能持有这种锁。

即使每个操作是原子的,复合操作也不一定能保证原子性。

重入

重入意味着已经取得锁的线程,如果再次请求自己获得的锁,那么也是允许的。

重入的一种实现方法是,每个锁关联一个线程持有者和计数器。如果计数值为0时,锁将被释放。

对象的共享

使用同步可以避免多个线程在同一时刻访问相同的数据。

同步还有另外个重要方面,即保证内存可见性。我们不仅希望某个线程正在使用对象状态而另个线程同时在修改改状态。

而且希望当一个线程修改了对象状态后,其它线程能够看到状态的变化。

因此,加锁的意义不仅在于互斥,还包括内存可见性。

重排序

Java内存模型允许编译器和CPU对操作顺序进行重排序。

使用volatile类型后,编译器和运行时都会注意到这个变量是共享的,因此在读取volatile类型时,总会返回最新的值。

发布和逸出

当某个不该被发布的对象被发布时,称为逸出。

ThreadLocal

ThreadLocal可以用于保证线程封闭。

开发人员不该滥用ThreadLocal,避免引入隐式的耦合。

ThreadLocal详细分析

基础构建模块

####同步容器类 同步容器类Vector\HashTable对于某个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。

同步容器类的效率低,而且需要注意避免ConcurrentModificationException。

诸如Set的toString()方法会隐藏的调用迭代器。

并发容器

ConcurrentHashMap采用了分段锁(Lock Striping)的机制,在并发情况下具有良好的性能。

同时ConcurrentHashMap提供了一系列复合的原子操作,如:

  1. putIfAbsent(K,V)仅当k没有对应的v值时插入
  2. remove(K,V)仅当K对应的值为v时删除
  3. replace(K,old,new)仅当k为old时才替换为new。

Queue和BlockingQueue是Java 5.0后新增的容器类,提供了先进先出的队列。

Queue在没有元素时将返回null,而BlockingQueue则将阻塞,直到队列不为空。

BlockingQueue可以用于生产者-消费者模式。

Java 6中增加了双端队列Deque(发音deck)和BlockingDeque。

Deque可以在队首和队尾插入和移除。

和BlockingQueue不同的是,多个线程可以分别拥有一个BlockingDeque,让自己的为空时,可以从别的线程的BlockingDeque的队尾获得数据,这样可以提升更高的效率。

同步工具类

除了BlockingQueue,同步工具类还有信号量semaphore、闭锁latch、栅栏barrier。

CountDownLatch是一种闭锁latch,countDown方法用于将计数递减,await方法等待直到计数器为0。

Semaphore则维护了一组资源的许可,当获取资源时,首先要通过acquire获得许可,然后通过release返回许可。

CyclicBarrier类似CountDownLatch,CountDownLatch用于等待的事件,而CyclicBarrier则用来等待线程。

CountDownLatch是一个线程等待多个线程,而CyclicBarrier则是多个线程同时等待。

CyclicBarrier像水闸一样,只有所有的水都到齐,超过一定的阈值,才能防闸出水。

FutureTask在Executor中表示异步操作,如果操作未完成,则get会等到操作结束。否则立即返回。

分享到:
评论

相关推荐

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    Java多线程编程技术

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

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    计算机后端-Java-Java核心基础-第20章 多线程 02. 复习:IDEA使用与多线程基本概念.avi

    计算机后端-Java-Java核心基础-第20章 多线程 02. 复习:IDEA使用与多线程基本概念.avi

    java多线程教程

    本教程主要讲解了java多线程的基本概念,多线程与单线程的区别,线程同步,线程死锁等内容

    Java多线程简单Demo

    个人的小总结,适合初学者,包含了java多线程的基本概念,再配上简单的demo,相信初学者学习完对多线程能有较清晰的认识

    Java多线程编程.pdf

    Java线程是Java语言中一个非常重要的部分,尤其是在Java5以后,Java对多线程做了很多扩展,大大增强了Java多线程编程的能力。这个专题涵盖了Java线程的概念和基本操作,并包含了一些高阶的设计及应用方法。

    Java多线程编程精解

    此文档详细介绍了java多线程编程的各个技术要点与注意事项并对一些基本概念进行了详细解释

    java基本教程之多线程基本概念 java多线程教程

    多线程是Java中不可避免的一个重要主体。下面是对“JDK中新增JUC包”之前的Java多线程内容的讲解,JUC包是由Java大师Doug Lea完成并在JDK1.5版本添加到Java中的

    java多线程机制

    本节内容包括 1. 线程的基本概念 2. 线程的创建和启动 3. 线程的调度和优先级 4. 线程的状态控制 5. 线程同步

    Java多线程学习笔记

    线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步

    java多线程的入门经典 实用

    这个资料从多线程的基本概念讲起,一直到能够熟练使用多线程,看完这个后能够直接进行多线程的程序开发,资料比较全面。

    java多线程综合实验2020年1月武汉理工大学1—7次实验源代码(运行通过).rar

    由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的...

    一篇文章弄懂Java多线程基础和Java内存模型

    文章目录一、多线程的生命周期及五种基本状态二、Java多线程的创建及启动1.继承Thread类,重写该类的run()方法2.通过实现Runnable接口创建线程类3.通过Callable和Future接口创建线程三、Java内存模型概念四、内存间...

    面向对象与多线程java实验.zip

    由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的...

    Java线程详解.ppt

    如果一个程序中要实现两段程序代码同时交替运行,就需要产生多个线程,并指定每个线程上所要运行的程序代码段,这就是多线程。 程序启动运行时,就自动产生了一个线程,main方法就是在这个线程上运行的,当不再产生...

    Java高并发实战_java高并发_高并发_

    第1章主要介绍了并行计算中相关的 些基本概念, 树立读者对并行计算的基本认识;介绍了两个重要的并行性能评估定律, 以及 Java 内存模型 JMM。第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本...

    java多线程tcpsocketserver源码-Java-Book:Java学习资料整理

    java多线程tcp socket server源码 Java学习资料整理 框架 / dubbo监控 / / / / / / / / / / / / / / / / / / / / 收藏 / 技术社区 书籍推荐 计算机基础 计算机科学导论 --(如果不是计算机科班的,应先看看计算机基础...

Global site tag (gtag.js) - Google Analytics