多线程的安全问题:
当多条语句在操作一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
另一个线程参与进来执行,导致共享数据的错误
如:经典的买票问题:
class Ticket implements Runnable{
private int tick=100;
public void run(){
System.out.println(Thread.currentThread().getName()++"----"+tick--);
}
}
class Demo{
public static void main(String[] args) {
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
}
}
解决方法:
对多条操作共享数据的语句,只能让一个线程都执行完,其他线程才可以参与,
就是同步代码块
synchronized(对象){
需要被同步的代码
}
改进后:
class Ticket implements Runnable{
private int tick=100;
Object obj=new Object();
public void run(){
while(true){
synchronized(obj){
if(tick>0)
System.out.println(Thread.currentThread().getName()++"----"+tick--);
}
}
}
}
class Demo{
public static void main(String[] args) {
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
}
}
对象如同锁,持有锁的对象可以在线程中执行,
没有持有锁的线程即使获得了cpu执行权,也进不去,因为没有获得锁 |
|