Java synchronize线程安全测试
线程的运行是与当前CPU的资源调度与时间片是有关系的,当一个线程中的执行到某一部分方法的时候轮到另外一个线程来执行相应的代码,所以还没有等到第一个线程执行完那么CPU有切换到另外一个线程来运行其相应的代码,所以这个时候假如操作公共的数据部分就会出现错误
为了解决这个问题,可以使用synchronized同步代码块来对公共部分进行同步操作
在用synchronize关键字修饰同步代码块时,运行代码发现不能交替卖票。以下是初始代码
packagecom.itheima.Test;
publicclassTest1a{
publicstaticvoidmain(String[]args){
Ticket1at1=newTicket1a();
newThread(t1,"A").start();
newThread(t1,"B").start();
newThread(t1,"C").start();
}
}
classTicket1aimplementsRunnable{
intticket=100;
@Override
publicvoidrun(){
synchronized(Ticket1a.class){
while(true){
if(ticket<=0){
break;
}
try{
Thread.sleep(20);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"sold"+(ticket--));
}
}
}
}
运行结果:
Asold100 Asold99 Asold98 Asold97 Asold96 Asold95 Asold94 Asold93 Asold92 Asold91 . . . Asold10 Asold9 Asold8 Asold7 Asold6 Asold5 Asold4 Asold3 Asold2 Asold1
虽然解决了线程的安全问题,但是不能实现三个窗口交替卖票。后来仔细一看,是synchronize关键字修饰的代码块位置不对,相当于修饰了同步方法。
更改后:
@Override
publicvoidrun(){
while(true){
synchronized(Ticket1a.class){
if(ticket<=0){
break;
}
try{
Thread.sleep(20);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"sold"+(ticket--));
}
}
}
这样就完成了线程安全的小测试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。