黑马程序员技术交流社区
标题:
多线程的安全问题
[打印本页]
作者:
Good_Man
时间:
2015-11-30 14:36
标题:
多线程的安全问题
多线程的安全问题:
当多条语句在操作一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
另一个线程参与进来执行,导致共享数据的错误
如:经典的买票问题:
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执行权,也进不去,因为没有获得锁
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2