多个线程访问共享对象和数据有很多方式,但是可以分为两大类:1.多线程执行代码相同的。2.多线程执行代码不同的
对于多线程执行代码相同的情况来说:
1)使用同一个Runnable对象,在new Thread的时候放入相同的这个对象
public static void main(String[] args) {
Runnable r = new Runnable() {
int num = 100;
@Override
public synchronized void run() {
System.out.println(++num + "==add");
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
对于多线程代码不同的情况来说:
1)将需要共享的对象或者数据放入另一个对象中,这个对象对外提供对其操作的方法,由不同的线程调用。
class Number {
int num = 100;
public int add() {
return ++num;
}
public int del() {
return --num;
}
}
Runnable对象中使用同一个Number对象
public static void main(String[] args) {
final Number num = new Number();
Runnable rAdd = new Runnable() {
@Override
public synchronized void run() {
System.out.println(num.add() + "==add");
}
};
Runnable rDel = new Runnable() {
@Override
public synchronized void run() {
System.out.println(num.del() + "==del");
}
};
Thread t1 = new Thread(rAdd);
Thread t2 = new Thread(rDel);
Thread t3 = new Thread(rAdd);
t1.start();
t2.start();
t3.start();
}
2)将Runnable写成内部类的形式,然后将需要共享的对象和数据写成外部类的成员变量。
class Number{
int num = 100;
Runnable r_add = new Runnable() {
@Override
public synchronized void run() {
System.out.println(++num+"==add");
}
};
Runnable r_del = new Runnable() {
@Override
public synchronized void run() {
System.out.println(--num+"==del");
}
};
}
然后通过调用Number对象中的内部类对象来实现。
public static void main(String[] args) {
Number n = new Number();
Thread t1 = new Thread(n.r_add);
Thread t2 = new Thread(n.r_del);
t1.start();
t2.start();
}
------------------------------------------------------------------------------
还有一种方法简单粗暴,就是把需要共享的对象和数据用static修饰。