当用多个线程处理共享变量时,线程中对共享变量的处理代码应用同步机制进行保护,才能保证处理的正确性。 import java.util.*; class BackCounter implements Runnable{ private int count=100; //线程共享变量,对它的处理必须用同步机制进行保护 public int getCount() { return count; }//返回变量值 //线程体 public void run() { for(int i=10;i>0;i--) { //变量值递减 10 { //以下代码在处理共享变量,需要同步机制保护 if( count<=0 ) break; count--; } try { Thread.sleep(10); } catch ( InterruptedException e ) { }//模拟延时 10 毫秒 } }//线程体结束 } public class Main { public static void main(String[] args) throws InterruptedException {//某些线程方法会抛出检查型异常 ArrayList<Thread> lt=new ArrayList<Thread>(); BackCounter bc=new BackCounter();//创建实现类对象 lt.add(new Thread(bc));//创建线程对象 lt.add(new Thread(bc)); for (Thread th:lt) ; //启动线程 for (Thread th:lt) ; //等待线程结束 System.out.println(bc.getCount()); } }
时间: 2024-02-14 18:14:44 浏览: 161
以上 Java 代码中,BackCounter 类实现了 Runnable 接口,它包含一个共享变量 count,用于多个线程之间的数据共享。在 run() 方法中,对 count 进行递减操作,但由于多个线程同时访问 count,可能会导致竞争条件,因此需要使用同步机制来保护共享变量的处理。
可以使用 synchronized 关键字来对处理 count 的代码块进行同步,保证在同一时刻只有一个线程能够访问该代码块。修改后的 BackCounter 类的代码如下:
```java
class BackCounter implements Runnable {
// 线程共享变量,对它的处理必须用同步机制进行保护
private int count = 100;
public synchronized int getCount() { // 使用 synchronized 关键字修饰方法
return count;
}
// 线程体
public void run() {
for (int i = 10; i > 0; i--) {
// 变量值递减 10
synchronized (this) { // 使用 synchronized 关键字锁住代码块
if (count <= 0)
break;
count--;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
} // 模拟延时 10 毫秒
}
}
}
```
在 main() 方法中,创建了两个 BackCounter 对象,并将它们作为参数创建了两个 Thread 对象,然后启动线程并等待其结束,最后输出 BackCounter 对象的 count 值。由于 count 在多个线程之间进行共享,所以输出的结果可能会不确定。使用同步机制可以保证 count 的处理正确性。
阅读全文