多线程问题及处理
如果多个线程同时访问一个资源,例如变量、文件等,如何保证访问安全的问题。在多线程编程中,这种会被多个线程同时访问的资源叫做临界资源。
解决这个问题最基本,最简单的思路就是使用同步关键字synchronized。synchronized关键字是一个修饰符,可以修饰方法或代码块,其的作用就是,对于同一个对象(不是一个类的不同对象),当多个线程都同时调用该方法或代码块时,必须依次执行,也就是说,如果两个或两个以上的线程同时执行该段代码时,如果一个线程已经开始执行该段代码,则另外一个线程必须等待这个线程执行完这段代码才能开始执行。
实例:多线程实现卖票事例
class Tickets{
publicinttickets;
public Tickets(){
tickets=10;
}
publicsynchronizedvoid action(String name){
System.out.println(name+"买了"+tickets+"号票");
tickets--;
}
}
class TicketsThread extends Thread{
Tickets t;
String name;
public TicketsThread(Tickets t,String name){
this.t=t;
this.name=name;
start();
}
publicvoid run(){
for(int i=0;i<5;i++){
t.action(name);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
publicclass TestMulThread {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
Tickets t=new Tickets();
TicketsThread t1=new TicketsThread(t,"小王");
TicketsThread t2=new TicketsThread(t,"小张");
}
}