`
Kensai
  • 浏览: 15843 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
saw
文章分类
社区版块
存档分类
最新评论

JAVA多线程的一点总结,真的只有一点。

阅读更多

   前段时间,因为出了一个貌似和多线程有关的问题(最后证明又不是)。我好好的看了下一些多线程的资料。做下简单的总结免得以后搞忘了。

   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多线程编程总结.pdf

    Java多线程编程是Java语言中的一项高级特性,它允许同时运行多个线程来执行多个任务,以达到提高程序运行效率和用户体验的目的。Java 5 是在Java多线程编程中具有重要意义的一个版本,因为它对Java的并发API进行了...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    java多线程设计模式详解

    在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...

    java多线程.pdf

    Java多线程编程是Java语言提供的一种基础...总结来说,Java多线程编程涉及线程的创建与管理、线程间的同步与通信、并发控制策略,以及高级并发工具的运用。掌握这些知识点对于开发出高性能、高并发的应用程序至关重要。

    java线程学习总结.pdf

    在Java中,线程的管理、同步和通信是实现多线程编程的关键。 1. **线程的基本术语和概念** - **线程状态**:Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止...

    Java多线程-JDK5.0新增线程创建方式

    ### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...

    Java-学习多线程总结上

    所以在进程之上的进一步划分就变得非常的重要,而且性能也会有所提高,所有的线程一定要依附进程才能够存在,那么进程一旦消失,线程也一定会消失,但反过来不一定,而Java是支持多线程的开发语言之一。 2. 多线程的...

    MutThread-多线程

    总结来说,"MutThread-多线程"实例是一个演示如何在程序中使用临界区技术实现线程同步的案例。它通过互斥量确保了对共享资源的安全访问,防止了数据不一致的问题。同时,它可能也涉及到了线程的创建、销毁和线程间的...

    Java 多线程同步 锁机制与synchronized深入解析

    总结来说,Java的synchronized关键字提供了锁机制,用于实现多线程环境下的同步。同步方法和同步代码块是两种不同级别的同步控制,同步代码块提供了更灵活的控制和更高的效率。理解并合理使用这些机制对于编写高效、...

    java基础知识大总结

    24. **同步机制**:为了确保多线程环境下的数据安全,Java提供了多种同步机制,包括`synchronized`关键字和`ReentrantLock`等。其中`synchronized`关键字可以用于修饰方法或者代码块,以实现对资源的独占访问。 25....

    java后端1年经验和技术总结

    ### Java后端1年经验和技术总结 #### 一、引言与反思 在从事Java后端开发的一年时间里,作者不仅学到了许多宝贵的技术知识,也在实践中不断修正自己的思维方式和工作习惯。以下是对过去一年经历的一些反思: 1. *...

    Java 并发核心编程

    Java并发编程涉及多个层次的概念和实践,从Java内存模型的基础理论到具体的并发集合类使用,每一个知识点都是构建高性能、高可靠性的多线程应用程序的关键。理解和掌握这些核心理念,能够帮助开发者避免常见的并发...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 ...以上是Java并发编程实践笔记中总结的关键知识点,涵盖了从基本概念到高级技术的应用,旨在帮助开发者构建高效、可靠的多线程应用。

    JAVA程序员的心得

    从给定的信息来看,虽然部分内容存在乱码情况,但标题和描述为我们提供了一些关于JAVA...每一点都旨在帮助JAVA程序员们提升自我、实现职业生涯的成长。希望这些心得能够对你有所帮助,让你在IT行业中飞得更高更远。

    JavaLock与Condition的理解Reentran

    总结,Java Lock与Condition的使用能够帮助开发者更好地控制线程的同步和通信,提升多线程程序的效率和可控性。ReentrantLock作为其中的核心,提供了丰富的特性,而Condition则是实现复杂并发逻辑的重要工具。理解并...

    Advanced-Concurrency:尝试并发多线程程序

    本项目旨在探索和实践高级并发技术,帮助开发者掌握创建并发多线程程序的方法。在这个过程中,我们将会深入理解Java中的并发工具、线程池、锁机制以及同步原语等核心概念。 首先,我们要了解Java中的线程。线程是...

    Java初学者都必须知道的六大问题.doc|Java初学者都必须知道的六大问题.doc

    这种不可变性确保了String对象的安全性,尤其在多线程环境下,但也意味着频繁的字符串拼接操作会消耗额外的内存,因为每次都会创建新的对象。 4. 构造String对象的方式 在Java中,创建String对象有两种常见方式:...

    synchronized关键字的用法详解

    通过上述分析可以看出,`synchronized`关键字是Java多线程编程中不可或缺的一部分。它不仅提供了一种简单有效的同步机制,还具备自动解锁和可重入等高级特性,使得开发人员能够轻松地编写出高效且可靠的多线程程序。...

    11原理 1:鞭辟入里 —— 线程 IO 模型(1).md

    这听起来似乎与高性能相悖,因为在多核CPU时代,多线程似乎是提升性能的不二法门。但实际上,Redis的单线程模型是通过异步非阻塞的方式处理并发,加之其数据操作都在内存中进行,因此可以达到非常高的执行速度。 在...

Global site tag (gtag.js) - Google Analytics