1.多线程
程序:programe,静态的代码
进程:progress,执行的程序
线程:thread,一个进程中的多条执行路径
进程:独享CPU,数据空间
线程;共享数据空间,独享栈区和程序计数器,多个线程是一个线程组
线程间共享信息更容易
java程序中:main,gc,异常处理 至少3条线程
java中多线程就是多条执行路径,每条路径都有自己独立的栈区,一条路径就是一个方法调用栈,多个线程共享堆空间,所以可以共享信息
多线程就是多个方法调用栈,多条线程可以调用同一个方法,如果这个方法操作了同一个数据,就会发生同步问题,也就是线程不安全问题
线程不安全的本质是:比如 number = a+b;
寄存器需要先从内存把number,a,b都取出来,计算后把新的number存进number的内存,需要好几步操作,如果在操作中间线程被挂起,其他取number的方法就会取到错误的数据,可以类比数据库中的 原子性操作
进程间通信方式:文件,信号量,管道,socket
java实现多线程的方式:extends Thread ,implements Runnable, implements Callable通过启动线程池
Thread也是实现了Runnable接口,采用代理模式启动线程
代理模式:代理类和实体类实现同一个接口,实现相同的方法,代理类的方法调用实体类的方法。代理类中要持有实体类的引用。
2.sleep,wait,join,yield
sleep是Thread的static方法,写到那个线程就是哪个线程暂停,不放弃锁
wait是Object的方法,暂停线程但放弃锁
yield是Thread的方法,表示自己可以让出资源
join是Thread的方法,线程一中执行 线程2.join,表示线程1要让步等线程2执行完线程1在执行
3.线程的状态
新生,new出来就是新生
准备,start以后就是准备,或者从阻塞或暂停状态恢复过来也是准备状态
运行,系统调用
暂停(或者等待状态,调用sleep,join,wait)或阻塞(需要锁的状态)
死亡
4.线程的信息
Thread的currentThread()方法可以获得当前线程,写在哪个线程就是获得哪个线程
getName,setName
setPriority,getPriority设置显示优先级
5.同步问题
多个线程(其实就是多个同时进行的方法)对同一份资源或者同一个变量同时调用,由于调用资源的时候随时可能被挂起而导致其他方法得到错误的资源信息
参考 数据库 中 原子性操作的原理
synchronized方法可以保证多线程安全。
根本原理是每个对象都有一个锁,只有获得锁的线程才能调用对象的锁定方法,synchronized方法是向系统声明这个对象的方法要加锁,对象锁是锁定所有synchronized方法,一旦一个线程在调用synchronized方法,其他线程无法调用这个对象的synchronized方法或代码块
synchronized块
synchronized(对象引用 | this | 类.class){
}
线程安全的类运行效率低 Hashtable和StringBuffer都是线程安全的
程序:programe,静态的代码
进程:progress,执行的程序
线程:thread,一个进程中的多条执行路径
进程:独享CPU,数据空间
线程;共享数据空间,独享栈区和程序计数器,多个线程是一个线程组
线程间共享信息更容易
java程序中:main,gc,异常处理 至少3条线程
java中多线程就是多条执行路径,每条路径都有自己独立的栈区,一条路径就是一个方法调用栈,多个线程共享堆空间,所以可以共享信息
多线程就是多个方法调用栈,多条线程可以调用同一个方法,如果这个方法操作了同一个数据,就会发生同步问题,也就是线程不安全问题
线程不安全的本质是:比如 number = a+b;
寄存器需要先从内存把number,a,b都取出来,计算后把新的number存进number的内存,需要好几步操作,如果在操作中间线程被挂起,其他取number的方法就会取到错误的数据,可以类比数据库中的 原子性操作
进程间通信方式:文件,信号量,管道,socket
java实现多线程的方式:extends Thread ,implements Runnable, implements Callable通过启动线程池
Thread也是实现了Runnable接口,采用代理模式启动线程
代理模式:代理类和实体类实现同一个接口,实现相同的方法,代理类的方法调用实体类的方法。代理类中要持有实体类的引用。
2.sleep,wait,join,yield
sleep是Thread的static方法,写到那个线程就是哪个线程暂停,不放弃锁
wait是Object的方法,暂停线程但放弃锁
yield是Thread的方法,表示自己可以让出资源
join是Thread的方法,线程一中执行 线程2.join,表示线程1要让步等线程2执行完线程1在执行
3.线程的状态
新生,new出来就是新生
准备,start以后就是准备,或者从阻塞或暂停状态恢复过来也是准备状态
运行,系统调用
暂停(或者等待状态,调用sleep,join,wait)或阻塞(需要锁的状态)
死亡
4.线程的信息
Thread的currentThread()方法可以获得当前线程,写在哪个线程就是获得哪个线程
getName,setName
setPriority,getPriority设置显示优先级
5.同步问题
多个线程(其实就是多个同时进行的方法)对同一份资源或者同一个变量同时调用,由于调用资源的时候随时可能被挂起而导致其他方法得到错误的资源信息
参考 数据库 中 原子性操作的原理
synchronized方法可以保证多线程安全。
根本原理是每个对象都有一个锁,只有获得锁的线程才能调用对象的锁定方法,synchronized方法是向系统声明这个对象的方法要加锁,对象锁是锁定所有synchronized方法,一旦一个线程在调用synchronized方法,其他线程无法调用这个对象的synchronized方法或代码块
synchronized块
synchronized(对象引用 | this | 类.class){
}
线程安全的类运行效率低 Hashtable和StringBuffer都是线程安全的