解决线程安全问题的三种方法
一、使用同步代码块
如:卖票案例 出现了线程安全 重复的票不能出现
步骤
成员位置建立锁对象;
synchronized(锁对象){
出现安全问题代码
}
1 锁对象 任意对象
2 必须保证多个线程使用的是同一个锁对象
3 把{} 只让一个线程进
例子:
public class RunnableImpl implements Runnable{
// 定义共享资源 线程不安全
private int ticket = 100;
//在成员位置创建一个锁对象
Object obj = new Object();
// 线程任务 卖票
@Override
public void run() {
while(true){
//建立锁对象
synchronized (obj){
if(ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//卖票操作
System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
ticket--;
}
}
}
}
}
二、使用同步方法解决多线程安全
步骤
1 创建一个方法 修饰符添加synchronized
2 把访问了 共享数据的代码放入到方法中
3 调用同步方法
例子
public class RunnableImpl implements Runnable{
// 定义共享资源 线程不安全
private int ticket = 100;
// 线程任务 卖票
@Override
public void run() {
while(true){
payTicket();//调用下面synchronized修饰的方法
}
}
public synchronized void payTicket(){
if(ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//卖票操作
System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
ticket--;
}
}
}