1.启动一个线程要给它一个名字。这样有助于排错诊断系统监控。
2.ThreadLocal: 线程局部变量。为每个使用该变量的线程提供一个变量值的副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
注意:使用ThreadLocal,一般都是声明在静态变量中,如果不断的创建ThreadLocal而且没有调用其remove方法,将会导致内存泄露。
3.为了方便并发执行任务,出现了一种专门用来执行任务的实现,也就是Executor。
由此,任务提交者不需要再创建管理线程,使用更方便,也减少了开销。
Executors是一个工厂类,可以通过它创建一系列Executor
通过execute方法接受任务task。然后根据一系列策略重用线程池中的空闲线程或者创建一个新的新线程来完成任务。
当然每个线程之间可能需要进行通讯。或者说任务提交者和任务执行者之间要进行交互。
这时候可以用Runnable或者Callable。其中Callable是有返回值的任务。
当Callable不能计算的时候会返回Exception.
Future是存放计算的结果,相对复杂一些,
get()是阻塞式的方法
get(long timeout,TimeUnit unit)是在一定时间内等待的方法。
4.阻塞队列
阻塞队列,是一种常用的并发数据结构,常用于生产者-消费者模式。
在Java中,有三种常用的阻塞队列:
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
看一下ArrayBlockingQueue的 put / take 方法
除了take以外还有
public E poll(long timeout, TimeUnit unit) throws InterruptedException
设置超时时间,可以防止死等。但请不用public E poll()
因为当队列为空时会直接返回null,无法起到阻塞的作用。
不用锁控制并发 lock-free结构(乐观锁)
通常都是三个部分组成:
①循环
②CAS (CompareAndSet)
③回退
lock-free相对于锁结构来说,适用与竞争比较小的情况同时也适用于短事务或者事务redo开销较小的情况。lock-free具有较小的开销,较快的速度。
5.CopyOnWrite
以CopyOnWriteArrayList为例
在set的时候会创建一个新数组,再把老数组Copy到新的数组上,这样会占用更多的内存,但是能保证更高的并发性
锁使用的忠告:
1. 使用支持CAS的数据结构,避免使用锁,如:AtomicXXX、ConcurrentMap、 CopyOnWriteList、ConcurrentLinkedQueue
2一定要使用锁的时候,注意获得锁的顺序,相反顺序获得锁,就容易产生死锁。
3死锁经常是无法完全避免的,鸵鸟策略被很多基础框架所采用。
4通过Dump线程的StackTrace,例如linux下执行命令kill -3 <pid>,或者jstack–l <pid>, 或者使用Jconsole连接上去查看线程的StackTrace,由此来诊断死锁问题。
5外部锁常被忽视而导致死锁,例如数据库的锁
6并发流程控制Barrier
Barrer是一种算法,简单说就是等所有元素都到达Barrer以后才允许穿越Barrer。
在java中的一种实现就是java.util.concurrent.CyclicBarrier
7定时器
ScheduledExecutorService
schedule(Runnablecommand, long delay, TimeUnitunit) : ScheduledFuture
延迟一定的时间开始任务。
分享到:
相关推荐
在"C++多线程学习"这个主题中,我们主要探讨的是如何在C++环境中创建和管理线程,以及解决并发访问时可能出现的问题。 一、C++11及后续版本中的多线程支持 自C++11标准开始,C++提供了内置的多线程库`<thread>`,...
多线程是计算机编程中的...这个学习汇总资料将涵盖以上提到的各个知识点,通过实例解析、代码示例和经典问题分析,帮助你深入理解多线程编程,提升并发编程能力。无论你是初学者还是经验丰富的开发者,都可以从中受益。
Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java...
多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...
C#多线程学习(一) 本篇文章将深入探讨C#中的多线程机制,涵盖了多线程的相关概念、进程、线程、多线程的好处和不利方面等。 一、什么是进程? 一个进程是指运行中的程序,包括程序所使用到的内存和系统资源。...
在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...
### 多线程学习文档知识点总结 #### 一、线程的基本概念及关系 ##### 进程(Process) - **定义**:进程是Windows系统中的一个基本概念,它包含了运行程序所需的所有资源。 - **特性**: - 相对独立性:一个进程...
关于C#多线程学习,本篇将深入探讨在C#中如何管理和操作线程,包括启动、停止、暂停线程、调整线程优先级等关键知识点。 ### 启动线程 在C#中,启动一个新线程通常通过`Thread`类实现。创建一个新的线程对象时,...
C#中的多线程是程序设计中的重要概念,特别是在现代计算环境中,多核处理器和并发执行的需求使得多线程成为了优化性能的关键技术。在C#中,多线程的运用可以提升程序的并发能力,充分利用硬件资源,提高CPU的利用率...
### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...
多线程概述,past,coolie,多线程控制,多线程验证码
本资源包针对初学者提供了全面的多线程学习资料,旨在帮助你快速入门并解决实际开发中的问题。 首先,线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。多线程编程能够提高程序的并发性和执行...
2. 线程安全测试:检查代码是否正确地处理了多线程环境下的数据访问。 3. 资源消耗测试:分析多线程运行时内存、CPU和其他资源的使用情况。 4. 并发测试:评估程序在高并发场景下的稳定性和响应能力。 5. 错误处理和...
### C#多线程学习详解 #### 一、多线程的基本概念 ##### 1. 什么是进程? 进程是程序的一次动态执行过程,它包含了正在运行的程序所需的内存、系统资源以及执行上下文。简单来说,当你启动一个程序时,操作系统会...
### Python多线程学习 在Python中,使用线程主要有两种方法:一是通过函数的方式,二是利用类来封装线程对象。这两种方式都是基于Python的标准库`thread`和`threading`来实现的。 #### 函数方式创建线程 使用`...
最后,"Linux多线程学习(五)"可能对这些知识进行了综合应用或者讨论了高级话题,如死锁预防和线程池的实现。 掌握这些多线程编程技术对于开发高效的Linux应用程序至关重要,无论是系统编程、网络服务还是并行计算...
### Java中的多线程学习总结 #### 一、线程与进程的概念 在计算机科学中,**进程**和**线程**是两个重要的概念。早期的Windows 3.x系统中,进程是最小的运行单位。到了Windows 95/NT等操作系统中,除了进程外还...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)synchronized关键字(2) 4. Java多线程学习(三)volatile关键字 5. Java多线程学习(四)等待/通知(wait/notify)机制 6. Java多...