线程安全问题
来源:互联网 发布:中国人民大学 知乎 编辑:程序博客网 时间:2024/06/09 23:12
线程并发安全问题:synchronized关键字,线程安全锁、同步监视器。
多线程在访问同一个数据时(写操作),可能会引发不安全操作。
①哪个线程报错不捕获,则线程死,不影响主程序。
②同步:同一时刻只能有一个执行,A和B配合工作,步调一致的处理(B得到A的执行结果才能继续)。如一群人上公交车。
异步:同一时刻能有多个执行,并发,各自干各自的。如一群人上卡车。
③synchronized可以修饰方法也可以单独作为语句块存在(同步块)。作用是限制多线程并发时同时访问该作用域。
④synchronized修饰方法后,会为方法上锁。方法就不是异步的了,而是同步的。锁的是当前对象。
⑤synchronized同步块:分析出只有一段代码需要上锁,则使用。效率比直接修饰方法要高。
⑥线程安全的效率低,如Vector、Hashtable。线程不安全的效率高,如ArrayList、HashMap
synchronized void getMoney(int money){ if(count==0){
throw new RuntimeException("余额为0"); }
Thread.yield(); count-=money; }
void getMoney(int money){
synchronized(this){//synchronized(Object){需要同步的代码片段}
if(count==0){ throw new RuntimeException("余额为0"); }
Thread.yield(); count-=money; }
13)Daemon后台线程也称为守护线程:当当前进程中“所有”“前台”线程死亡后,后台线程将被强制死亡(非自然死亡),无论是否还在运行。
①守护线程,必须在启动线程前调用。
②main方法也是靠线程运行的,且是一个前台线程。
③正在运行的线程都是守护线程时,JVM退出。
14)wait/notify方法
这两个方法不是在线程Thread中定义的方法,这两个方法定义在Object中。两个方法的作用是用于协调线程工作的。
①等待机制与锁机制密切关联:wait/notify方法必须与synchronized同时使用,谁调用wait或otify方法,就锁谁!
②wait()方法:当条将不满足时,则等待。当条件满足时,等待该条件的线程将被唤醒。如:浏览器显示一个图片,displayThread要想显示图片,则必须等代下载线程downloadThread将该图片下载完毕。如果图片没有下杂完成,则dialpayThread可以暂停。当downloadThread下载完成后,再通知displayThread可以显示了,此时displayThread继续执行。
③notify()方法:随机通知、唤醒一个在当前对象身上等待的线程。
④notifyAll方法:通知、唤醒所有在当前对象身上等待的线程。
12)线程并发安全问题:synchronized关键字,线程安全锁、同步监视器。
多线程在访问同一个数据时(写操作),可能会引发不安全操作。
①哪个线程报错不捕获,则线程死,不影响主程序。
②同步:同一时刻只能有一个执行,A和B配合工作,步调一致的处理(B得到A的执行结果才能继续)。如一群人上公交车。
异步:同一时刻能有多个执行,并发,各自干各自的。如一群人上卡车。
③synchronized可以修饰方法也可以单独作为语句块存在(同步块)。作用是限制多线程并发时同时访问该作用域。
④synchronized修饰方法后,会为方法上锁。方法就不是异步的了,而是同步的。锁的是当前对象。
⑤synchronized同步块:分析出只有一段代码需要上锁,则使用。效率比直接修饰方法要高。
⑥线程安全的效率低,如Vector、Hashtable。线程不安全的效率高,如ArrayList、HashMap
synchronized void getMoney(int money){ if(count==0){
throw new RuntimeException("余额为0"); }
Thread.yield(); count-=money; }
void getMoney(int money){
synchronized(this){//synchronized(Object){需要同步的代码片段}
if(count==0){ throw new RuntimeException("余额为0"); }
Thread.yield(); count-=money; }
Daemon后台线程也称为守护线程:当当前进程中“所有”“前台”线程死亡后,后台线程将被强制死亡(非自然死亡),无论是否还在运行。
①守护线程,必须在启动线程前调用。
②main方法也是靠线程运行的,且是一个前台线程。
③正在运行的线程都是守护线程时,JVM退出。
14)wait/notify方法
这两个方法不是在线程Thread中定义的方法,这两个方法定义在Object中。两个方法的作用是用于协调线程工作的。
①等待机制与锁机制密切关联:wait/notify方法必须与synchronized同时使用,谁调用wait或otify方法,就锁谁!
②wait()方法:当条将不满足时,则等待。当条件满足时,等待该条件的线程将被唤醒。如:浏览器显示一个图片,displayThread要想显示图片,则必须等代下载线程downloadThread将该图片下载完毕。如果图片没有下杂完成,则dialpayThread可以暂停。当downloadThread下载完成后,再通知displayThread可以显示了,此时displayThread继续执行。
③notify()方法:随机通知、唤醒一个在当前对象身上等待的线程。
④notifyAll方法:通知、唤醒所有在当前对象身上等待的线程。
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程同步---线程安全问题
- Markdown的使用
- shared server使用与配置
- 构造MaxTree O(n)方法
- 《hadoop进阶》PeopleRank从社交关系中挖掘价值用户
- jQuery事件鼠标事件
- 线程安全问题
- 复制字符串(16)
- PHP入门之简单表单
- POJ 2352 stars 巴蜀OJ 1329 Stars 夜空星辰
- Swift基础(四):闭包、枚举
- mysql慢查询全解析
- 图片延迟加载
- 第一次实习面试
- js处理一个div里面多个点击事件时出现的事件冲突 重复的解决方法 事件冒泡