多线程访问共享数据方式总结:
1.若每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,如卖票系统.
2.若每个线程执行的代码不同,这时需要用不同的Runnable对象,有以下几种方式来实现这些Runnable对象之间的数据共享:
2.1将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象上去完成,这样容易实现针对该数据进行的各种操作的互斥与通信.
2.2将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各种操作的互斥与通信.
总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样容易实现针对该数据进行的各种操作的互斥与通信.
如简单的卖票系统实现
public class Ticket {
private int ticket = 10;
private Lock lock = new ReentrantLock();
public void getTicket() {
lock.lock();
try {
Thread.sleep(1000);
if (ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "买票:ticket = " + ticket--);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class MyLock implements Runnable{
private Ticket ticket = new Ticket();
public void run() {
for (int i = 0; i < 10; i++) {
// 买票
ticket.getTicket();
}
}
public static void main(String[] args) {
MyLock lock = new MyLock();
Thread t1 = new Thread(lock);
Thread t2 = new Thread(lock);
Thread t3 = new Thread(lock);
t1.start();
t2.start();
t3.start();
}
}