关于java线程安全问题

线程:负责一个进程中的代码执行。线程是进程中的一个执行路径。


线程安全问题出现的根本原因:
1. 存在着两个或者两个以上的线程。
2. 多个线程共享了着一个资源, 而且操作资源的代码有多句。




线程安全问题的解决方案:

1. 使用同步代码块

格式:
synchronized(锁对象){
需要被同步的代码;
}

线程的生命周期状态图(线程总共有图中的这几种状态)
  sleep\wait()
   <----------临时阻塞<-------------   
调用了start方法 抢夺了cpu的执行权                                   执行完任务
创建 ---------------------> 可运行 ----------------------------->运行  -------------->消亡
  <---------------------------
被抢夺了cpu的执行权


同步代码块要注意的细节:
1. 锁对象可以是任意的对象、.
2. 锁对象必须是多个线程共享的对象(锁对象必须是唯一)。
3. 线程调用了sleep方法是不会释放锁对象的。
4. 只有会出现线程安全问题的时候才使用java的同步机制(同步代码块和同步 函数),


 死锁现象出现 的根本原因:
  1. 存在两个或者两个以上的线程存在。
  2. 多个线程必须共享两个或者两个以上的资源。


class SaleTickets extends Thread{
static int num = 50;  //非静态成员变量。 非静态成员变量在每个对象中都维护了一份数据。 

public SaleTickets(String name){
super(name); //调用父类一个参数的构造函数, 初始化线程的名字。
}
//线程的任务代码...
@Override
public void run() {
while(true){
synchronized ("锁") {
if(num>0){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"卖出了"+num+"号票");
num--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("售罄了...");
break;
}
}


}

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值