62,614
社区成员
发帖
与我相关
我的任务
分享
class A implements Runnable{
private static int totalTicketNumber=100;
private String name;
public A(String name) {
this.name=name;
}
@Override
public void run() {
for (int j = 0; j < 5; j++) {
totalTicketNumber--;
System.out.println(totalTicketNumber);
}
}
public static void main(String[] args) throws InterruptedException {
String name="线程";
A a=new A(name);
for (int i = 1; i <= 5; i++) {
Thread t=new Thread(a);
t.start();
}
}
}
多个线程共同操作的同一个数据(变量)就叫共享数据。
多个线程操作共享数据(本题为 totalTicketNumber),当其中一个线程操作共享数据时,未执行完毕的情况下,另一个线程也参与共享数据的操作,这时就会导致共享数据出现安全问题。
怎么解决?
我们让一个线程操作共享数据完毕的情况下,其他的线程才有机会参与共享数据的操作。
java语言中,使用线程的同步机制处理线程的安全问题,有两种办法:①同步代码块 synchronized(同步监视器){//同步监视器 即为锁,任何类的对象都可以充当锁,必须保
//证所有的线程公用同一把锁
//操作共享数据的代码
}
②同步方法 将操作共享数据的代码分离出来,声明为一个 synchronized的方法
如: public synchronized void show(){
//操作共享数据的代码
}
本题中,我们使用同步代码块处理线程的安全问题,处理如下
synchronized(this){//this表示当前对象,
totalTicketNumber--;
System.out.println(totalTicketNumber);
}Thread t = new Thread(new A())
而不是同一个 A 对象丢给每个 Thread。因为 Thread 是同时运行的,你这样就乱了。