理解高并发(3).多线程开发常见问题示例
来源:互联网 发布:mysql服务器 编辑:程序博客网 时间:2024/06/06 07:34
多线程开发过程中,经常会出现的一些问题:非线程安全、死锁、饥饿锁。 示例代码如下:
- 非线程安全
package com.zuche.thread.demo1;
public class TestClient {
public static void main(String[] args) {
final Account account = new Account(1000);
Thread t = new Thread(new Runnable(){
public void run() {
account.add(20);
}
});
Thread t1 = new Thread(new Runnable(){
public void run() {
account.withdraw(20);
}
});
t.start();
t1.start();
System.out.println("最后的金额:" + account.getBalance());
}
}
理论上最后的金额应该为1000
- 死锁
package com.zuche.thread.demo3;
public class WorkThread extends Thread{
private String adjustMoney = "adjustMoney";
private String work = "work";
private String ruleType;
public WorkThread(String ruleType){
this.ruleType = ruleType;
}
public void run(){
if(ruleType.equals("employee")){
employeeSay();
}
if(ruleType.equals("boss")){
bossSay();
}
}
private void employeeSay(){
synchronized(adjustMoney){
System.out.println("员工说,先调薪后干活");
synchronized (work) {
System.out.println("员工调薪顺利调薪,开始带劲的干活");
}
}
}
private void bossSay(){
synchronized(work){
System.out.println("老板说,先给我好好的干活再来谈加薪的事儿");
synchronized(adjustMoney){
System.out.println("活干的不错,可以适当的考虑加点钱");
}
}
}
}
运行后,程序不能正常退出,卡死在那儿。
死锁概念: 2个线程相互僵持不下,导致无法访问共享资源,最终无法释放锁资源。
- 饥饿锁
package com.zuche.thread.demo2;
public class Toilet{
public synchronized void doStaff(){
System.out.println(Thread.currentThread().getName() + " begin.");
clean();
while(true){
System.out.println(Thread.currentThread().getName() + " doing.");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void clean(){
}
}
运行后,另一个线程无法访问共享资源
饥饿锁概念: 一个线程占用着锁不放导致其它线程无法访问共享资源
阅读全文
0 0
- 理解高并发(3).多线程开发常见问题示例
- 多线程高并发【实战开发注意】
- Java并发多线程常见问题
- 多线程并发常见问题
- 多线程并发常见问题
- 高并发系统中的常见问题
- 高并发系统中的常见问题
- 高并发系统中的常见问题
- 多线程高并发解决办法
- 多线程高并发经验
- 多线程与高并发
- 多线程_高并发
- 多线程与高并发
- 多线程高并发
- 理解多线程并发
- java web开发高并发系列(4)---Java并发与多线程教程(2)
- java web开发高并发系列(4)---Java并发与多线程教程(2)
- 高并发等大型网站架构常见问题
- 理解高并发(2).我对并发编程的理解
- 9个最佳的大数据处理编程语言
- [字符串HASH][复杂度分析] NOI2017 .Day1 T2 蚯蚓排队
- STL空间配置器
- MNIST机器学习入门
- 理解高并发(3).多线程开发常见问题示例
- SSM整合
- JavaSE编程基础 第一章 初识Java
- windows下全文检索引擎sphinx/coreseek的安装配置
- 我实习在青岛
- kali linux 2016 配置ssh 实现远程登录
- 理解高并发(4).死锁监测方法
- 线程同步之关键代码段
- 骨骼蒙皮动画(Skinned Mesh)的原理解析(一)