前段时间,因为出了一个貌似和多线程有关的问题(最后证明又不是)。我好好的看了下一些多线程的资料。做下简单的总结免得以后搞忘了。
1。多线程产生原因。一是GUI,二是效率
2。处理多线程中,最重要的问题就是资源抢占问题。
解决思路有2个:a.上锁 b.让资源不被争抢
a.在java里面就是synchronize 或者新的Lock对象(Java5以后).synchronize 方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,做不到很小就synchronize一个区块。
b.就是ThreadLocal,ThreadLocal是线程独立的资源,如ThreadLocal<Integer> 那么每个线程都可以任意修改而互不影响.
它并不是一个Thread,而是thread local variable
具体看ThreadLocal的源码就了了,很简单
public class ThreadLocal
{
private Map values = Collections.synchronizedMap(new HashMap());
public Object get()
{
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread))
{
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue)
{
values.put(Thread.currentThread(), newValue);
}
public Object initialValue()
{
return null;
}
}
3.关于wait notify 老式同步方法。首先呢,写起来烦,代码绝对绝对高耦合,再之新的concurrency 包里有很多有用的同步类比如BlockingQueue
4.尽量不要直接用.start()起线程,而用Executor来管理。原因 1.多线程环境下如果有异常会直接飞出你的控制,当然有办法。2.就是随便.start()线程,可能会让线程所在对象在要使用的时候处于不完整状态。
关于如何多线程抓异常,thining in java 4th p1149有说,就是实现个ThreadFactory接口,然后把异常捕获器设给新开的线程,然后把实现了ThreadFactory的工厂给Executor 就O 了。
5.关于volatile,就是强制读类存数据,无视寄存器。不过即便这样,操作volatile类变量的时候仍然要加锁。
6.关于什么可以说是默认线程安全的。不安全的有 所有长度超过32位的读因为要读两次。
然后就是其他语言基本都是线程安全的自增比如
class A{
int i;
void f1(){i++;}
}
反编译出来结果:
aload_0
dup
getfield
iconst_1
iadd
putfield
return
读和+中间可能会产生CPU上下文切换,这个时候值肯能被改。
7.小技巧。//NOT thread safe
while(conditionXXXX){
//conditionXXXX could be changed here
synchonized(this){
//dosomething
}
}
//safe
synchonized(this){
while(conditionXXXX){
//dosomething
}
}
分享到:
相关推荐
Java多线程编程是Java语言中的一项高级特性,它允许同时运行多个线程来执行多个任务,以达到提高程序运行效率和用户体验的目的。Java 5 是在Java多线程编程中具有重要意义的一个版本,因为它对Java的并发API进行了...
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...
Java多线程编程是Java语言提供的一种基础...总结来说,Java多线程编程涉及线程的创建与管理、线程间的同步与通信、并发控制策略,以及高级并发工具的运用。掌握这些知识点对于开发出高性能、高并发的应用程序至关重要。
在Java中,线程的管理、同步和通信是实现多线程编程的关键。 1. **线程的基本术语和概念** - **线程状态**:Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止...
### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...
所以在进程之上的进一步划分就变得非常的重要,而且性能也会有所提高,所有的线程一定要依附进程才能够存在,那么进程一旦消失,线程也一定会消失,但反过来不一定,而Java是支持多线程的开发语言之一。 2. 多线程的...
总结来说,"MutThread-多线程"实例是一个演示如何在程序中使用临界区技术实现线程同步的案例。它通过互斥量确保了对共享资源的安全访问,防止了数据不一致的问题。同时,它可能也涉及到了线程的创建、销毁和线程间的...
总结来说,Java的synchronized关键字提供了锁机制,用于实现多线程环境下的同步。同步方法和同步代码块是两种不同级别的同步控制,同步代码块提供了更灵活的控制和更高的效率。理解并合理使用这些机制对于编写高效、...
24. **同步机制**:为了确保多线程环境下的数据安全,Java提供了多种同步机制,包括`synchronized`关键字和`ReentrantLock`等。其中`synchronized`关键字可以用于修饰方法或者代码块,以实现对资源的独占访问。 25....
### Java后端1年经验和技术总结 #### 一、引言与反思 在从事Java后端开发的一年时间里,作者不仅学到了许多宝贵的技术知识,也在实践中不断修正自己的思维方式和工作习惯。以下是对过去一年经历的一些反思: 1. *...
Java并发编程涉及多个层次的概念和实践,从Java内存模型的基础理论到具体的并发集合类使用,每一个知识点都是构建高性能、高可靠性的多线程应用程序的关键。理解和掌握这些核心理念,能够帮助开发者避免常见的并发...
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 ...以上是Java并发编程实践笔记中总结的关键知识点,涵盖了从基本概念到高级技术的应用,旨在帮助开发者构建高效、可靠的多线程应用。
从给定的信息来看,虽然部分内容存在乱码情况,但标题和描述为我们提供了一些关于JAVA...每一点都旨在帮助JAVA程序员们提升自我、实现职业生涯的成长。希望这些心得能够对你有所帮助,让你在IT行业中飞得更高更远。
总结,Java Lock与Condition的使用能够帮助开发者更好地控制线程的同步和通信,提升多线程程序的效率和可控性。ReentrantLock作为其中的核心,提供了丰富的特性,而Condition则是实现复杂并发逻辑的重要工具。理解并...
本项目旨在探索和实践高级并发技术,帮助开发者掌握创建并发多线程程序的方法。在这个过程中,我们将会深入理解Java中的并发工具、线程池、锁机制以及同步原语等核心概念。 首先,我们要了解Java中的线程。线程是...
这种不可变性确保了String对象的安全性,尤其在多线程环境下,但也意味着频繁的字符串拼接操作会消耗额外的内存,因为每次都会创建新的对象。 4. 构造String对象的方式 在Java中,创建String对象有两种常见方式:...
通过上述分析可以看出,`synchronized`关键字是Java多线程编程中不可或缺的一部分。它不仅提供了一种简单有效的同步机制,还具备自动解锁和可重入等高级特性,使得开发人员能够轻松地编写出高效且可靠的多线程程序。...
这听起来似乎与高性能相悖,因为在多核CPU时代,多线程似乎是提升性能的不二法门。但实际上,Redis的单线程模型是通过异步非阻塞的方式处理并发,加之其数据操作都在内存中进行,因此可以达到非常高的执行速度。 在...