确保多线程操作的是同一个共享资源
程序员文章站
2024-01-26 08:46:35
...
共享资源定义为成员变量
run()定义在内部类中,这样,内部类中的线程就可以直接访问同一份资源了
package thread;
/**
* 多线程共享资源的方式一:
*
* 操作共享资源的run()放到内部类中,然后操作外部类中定义的资源
*
* 1个线程负责加,1个线程负责减
*/
public class ShareDataStyle1 {
private int sharedData = 100;
public synchronized void add() {
sharedData++;
System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
}
public synchronized void minus() {
sharedData--;
System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
}
//内部类访问外部类的共享资源
class Add implements Runnable {
public void run() {
while(true)
add();
}
}
//内部类访问外部类的共享资源
class Minus implements Runnable {
public void run() {
while(true)
minus();
}
}
public static void main(String[] args) {
ShareDataStyle1 sharedDate = new ShareDataStyle1();
new Thread(sharedDate.new Add()).start();
new Thread(sharedDate.new Minus()).start();
}
}
共享资源在外部单独定义
然后,通过Runnable子类构造方法传入同一个资源即可
package thread;
/**
* 多线程共享资源的方式二:
*
* 将共享资源传递到不同的Runnable对象中
*
* 1个线程负责加,1个线程负责减
*/
public class ShareDataStyle2 {
public static void main(String[] args) {
SharedData data = new SharedData();
new Thread(new Add(data)).start();
new Thread(new Minus(data)).start();
}
}
class SharedData {
private int sharedData = 100;
public synchronized void add() {
sharedData++;
System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
}
public synchronized void minus() {
sharedData--;
System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
}
}
class Add implements Runnable {
SharedData sharedData;
public Add(SharedData sharedData) {
this.sharedData = sharedData;
}
public void run() {
while(true)
sharedData.add();
}
}
class Minus implements Runnable {
SharedData sharedData;
public Minus(SharedData sharedData) {
this.sharedData = sharedData;
}
public void run() {
while(true)
sharedData.minus();
}
}