JAVA线程

 

资料整理自网络(侵删)
整理by Doing

线程状态    
 
线程内存:
线程的working memory只是cpu的寄存器和高速缓存的抽象描述

线程间通信
        Object类中wait() otify() otifyAll()方法可以用于线程间通信关于资源的锁的状态。
        wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用(查看API文档)
当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。
 

线程安全 
        Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本,当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下:
(1) 从主存复制变量到当前工作内存 (read and load)
(2) 执行代码,改变共享变量值 (use and assign)
(3) 用工作内存数据刷新主存相关内容 (store and write)
assign,store,write顺序可以由JVM实现系统决定.
 
  • synchronized关键字 :既保证了多线程的并发有序性,又保证了多线程的内存可见性
synchronized(锁){
     临界区代码
}
一个线程执行临界区代码过程如下:
1 获得同步锁
2 清空工作内存
3 从主存拷贝变量副本到工作内存
4 对这些变量计算
5 将变量从工作内存写回到主存
6 释放锁
  • volatile关键字 只能保证多线程的内存可见性,不能保证多线程的执行有序性
任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。
 

线程池
用于复用线程
 
 



原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5530509.html