当前位置:文档之家› java多线程解析

java多线程解析

用于同一数据。 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被
回滚。
线程安全
如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程 安全的。
线程安全问题都是由全局变量及静态变量引起的。
多线程模式介绍 (与资源相关)
Single thread execution pattern (syschronized)。
同一实例的synchronized方法同ed方法 是可以并发的
Java 多线程相关内容(单一JVM中)
wait()、notify()、notifyAll()、sleep()
需要在线程间相互唤醒的话就需要借助wait(), nofity(),notifyAll()了。 wait(),notify()必须要与synchronized一起使用,也就是wait,与notify是针对已经获取了 Obj锁进行操作. wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象 的notify()唤醒该线程,才能继续获取对象锁,并继续执行。 notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对 象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后. JVM会在wait()对象锁 的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。 notifyAll()会唤醒所有为获得本对象锁而处于休眠状态的线程。 sleep()与wait()区别在于,wait()会释放对象锁,sleep()则不会。
。 当警戒条件不成立时想要马上退出,就使用Balking Pattern
多线程模式介绍 (线程管理相关)
Two-Phase Termination 两阶段终止
从外部忽然结束掉线程,会丧失安全性。
定义一个送出“终止请求”的方法用来结束线程。这个方法事实上只会将标识设置成“收到终止 请求”而已,线程要在每个可以开始终止处理的地方检查这个标识,如果检查结果为真,就开始进行 终止处理。
如果工作存储器有未映像到主存储器的工作拷贝,则该内容就会被强制写入主存储器。这样之前 的计算结果会被全部写入主存储器,因而可以被其他线程看到。
紧接着,工作存储器上的工作拷贝将会被全部丢弃。之后,欲引用主存储器上的值,必定会从主 存储器将值拷贝到工作拷贝。
当线程要退出synchronized时:
如果如果工作存储器有未映像到主存储器的工作拷贝,则该内容就会被强制写入主存储器。这样 之前的计算结果会被全部写入主存储器,因而可以被其他线程看到
Worker thread pattern (工作者模式)
等到工作来,来了就工作 将任务的产生和处理进行分离。例如IM中针对消息的处理机制。
多线程模式介绍 (与条件警戒相关)
Guarded Suspension Pattern 条件警戒模式
多个线程共享一个实例 若多个线程都擅自更改实例的状态,实例会丧失安全性。 当实例的状态不恰当时,就要求线程等待到适合的状态。首先,以“警戒条件”来表示实例的 “适当的状态”。并且在进行有安全性疑惑的操作前,都要检查是否警戒条件满足。如果警戒条件不 成立,就要求线程等待到成立为止。
多线程模式介绍 (与异步任务相关)
future
异步执行任务,在任务执行结束后,能够取得任务处理结果
Thread-per-message pattern
发起异步任务,但不需要得到处理结果
多线程模式介绍 (与资源池相关)
Producer Consumer pattern(生产者消费者模式)
生产者,将产生的产品放到池中。消费者从池中取得产品进行消费 例如仓库存放及提取
针对方法或程序块添加同步锁
Immutable (final类)
例如java中所有基础数据类,例如String,Integer。主要针对解决线程安全问题。 final + static + 不可变类
Balking pattern 放弃模式
判断资源状态,如果状态不满足,则放弃操作
Read-write lock pattern (读写锁)
JAVA 多线程
多线程的必要性
一个CPU同一时间只能运行一个进程。进程相互独立,数据 不共享。
单线程模式
效率低下,未充分合理的利用CPU
多线程模式
共享内存,可以实现多任务
多线程编程面临的挑战
共享数据\资源的带来的事务性问题(ACID)
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成。 一致性:任何一个读取总是能读取到之前完成的写操作。 隔离性:为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求
Java 多线程相关内容(单一JVM中)
static
static 是存储在常量存储区中,一个jvm只有一份 final static 不可变对象
volatile
volatile告知jvm,它所修饰的变量不保留拷贝,直接访问内存堆。 在java内存模型中,有main memory,每个线程也有自己的memeory,(例如寄存器)。出于性 能考虑线程会在自己的memory中访问变量副本。 但不是简单使用volatile,则对这个变量的操作都是原子操作。当变量值由自己决定时,volatile失 效。(n=n+m)。当此情况出现时,可用syschronized进行修饰。 原子操作:是指不会被线程调度机制打断的操作,这种操作一旦可是,就一致运行到结束,中间 不会有任何contex switch(切换到另外一个线程)
Java 多线程相关内容(单一JVM中)
Synchronized
多线程同步依赖锁机制,通过对共享资源锁的获取和释放,协同各线程的工作。
对于java程序来说,每个对象实例都有一把“锁”。获取锁的方法就是synchronized 。 synchronized就是针对内存区块申请内存锁
当进入synchronized时
Thread-Specific Storage Pattern -线程保管箱模式
想要将假定在单线程环境下运行的对象(TSObject),在多线程的环境下使用。 建立线程独有的空间,并管理这些空间与线程的对照关系 建立一个与TSObject具有相同接口的TSObjectProxy参与者。并建立 TSObjectCollention,管理“Client-->TSObject”的对照关系。 实现:Java语言中,使用ng.ThreadLocal类担任TSObjectCollention。
相关主题