多线程访问共享数据方式总结:
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(); } }