多线程数据共享分析

如果多个线程的代码是一样的

package thread.multithread.tradition;

import java.util.Random;

public class MultiThreadInAndDe {
	
	static ShareData sd=new ShareData();
	
	public static void main(String[] args) {
		Store store=new Store();
		for(int i=0;i<10;i++){
			new Thread(store).start();
			
		}
	}

	
}


class Store implements Runnable{

	int count=100;
	public Store(int k){
		count=k;
	}
	public Store(){
		
	}
	@Override
	public void run() {
		decrement();
		
	}
	private  synchronized void decrement(){
		count--;
		System.out.println(Thread.currentThread().getName()+" count"+count);
	}
	
}


多个线程的逻辑不一样

    首先把要操作的对象封装成一个对象,然后对外提供不同的处理逻辑

     不使用内部类

     把不同的逻辑写到不同的实现了runnable的的类的run方法中,再把之前的操作对象作为参数传递进不同的实现了runnable的的类中(构造方法,set方法俱可)

public class MultiThreadInAndDe {

	public static void main(String[] args) {

		ShareData sd = new ShareData();
		ADD add = new ADD(sd);
		for (int i = 0; i < 10; i++) {
			new Thread(add).start();
		}
		SUB sub = new SUB(sd);
		for (int i = 0; i < 10; i++) {
			new Thread(sub).start();
		}
	}

}

class ShareData {
	static int i = 100;

	public synchronized void increment() {
		i++;
		System.out.println(i);
	}

	public synchronized void decrement() {
		i--;
		System.out.println(i);
	}
}

class ADD implements Runnable {
	ShareData count;

	public ADD(ShareData k) {
		count = k;
	}

	@Override
	public void run() {
		count.decrement();
	}
}

class SUB implements Runnable {
	ShareData count;

	public SUB(ShareData k) {
		count = k;
	}

	@Override
	public void run() {
		count.decrement();

	}

}


 
  

     使用内部类

         

                final ShareData sd=new ShareData();
		for(int i=0;i<10;i++)
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					sd.decrement();
					
				}
			}).start();
		
		for(int i=0;i<10;i++)
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					sd.increment();
					
				}
			}).start();
当然,ShareData sd=new ShareData();也可以改成外部类的成员变量

      





你可能感兴趣的:(多线程数据共享分析)