多线程访问共享数据

多线程访问共享数据方式总结:

 

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();
	}
}
 

你可能感兴趣的:(java,Concurrent)