Java需要并发控制三个原因:

  1. 多线程环境

  2. 存在共享资源

  3. 多个线程操作(修改)共享资源

下面分别用继承Thread类和实现Runnable接口俩种方式实现并发控制,

继承Thread类

继承Thread类方式,最后创建对象是因为会是三个不同的线程对象,所以需要将共享资源和锁都静态化,如果不这样的话,就不存在共享资源一说了,自然也没有并发控制的说法。

class MyThread extends Thread{
 //电影票总数100张
 private static int ticket=100;
 //锁对象
 private static Object obj = new Object();
 @Override
 public void run() {
 while(true){
 synchronized (obj) { 
 if(ticket>0){
 System.out.println(this.currentThread().getName()+"正在出售第"+ticket--+"张票");
 }
 }
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 }
}
public class ThreadDemo {
 public static void main(String[] args) {
 Thread t1 = new MyThread();
 Thread t2 = new MyThread();
 Thread t3 = new MyThread();
 t1.setName("售票员1");
 t2.setName("售票员2");
 t3.setName("售票员3");
 t1.start();
 t2.start();
 t3.start();
 }
}

实现Runnable接口

实现Runnable接口方式,因为构造函数中,需要传入一个Runnable接口类型,所以这里就直接存在共享资源了,静态修饰可有可无,但是还是写上比较好。

class MyRunnable implements Runnable{
 //电影票总数100张
 private int ticket=100;
 //锁对象
 private Object obj = new Object();
 @Override
 public void run() {
 while(true){
 synchronized (obj) { 
 if(ticket>0){
 System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket--+"张票");
 }
 }
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 }
}
public class RunnableDemo {
 public static void main(String[] args) {
 Runnable r = new MyRunnable();
 Thread t1 = new Thread(r,"售票员1");
 Thread t2 = new Thread(r,"售票员2");
 Thread t3 = new Thread(r,"售票员3");
 Thread t4 = new Thread(加群,"874811168");

 t1.start();
 t2.start();
 t3.start();
 t4.start(免费获取资料一份);

 }
}