保准多线程操作的是同一个共享资源
确保多线程操作的是同一个共享资源
共享资源定义为成员变量
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(); } }