多个线程并发抢占资源是,就会存在线程并发问题,造成实际资源与预期不符合的情况。这个时候需要设置“资源互斥”。
1.创建资源,这个地方我创建了一个资源对象threadResource,对象内有一个属性num。
1 package com.bluej.javaj.thread.first; 2 3 /** 4 * 使用同步方式-资源互斥 5 * @author xingdongjie 6 * 7 */ 8 public class ThreadResource { 9 10 private int num=100; 11 12 /** 13 * 同步方法方式 14 */ 15 public synchronized void sell(){ 16 System.out.println(Thread.currentThread().getId()); 17 num--; 18 System.out.println("---出售一个,剩余"+num+"个资源"); 19 } 20 21 /** 22 * 同步代码块方式 23 */ 24 public void sell2(){ 25 synchronized(this){ 26 System.out.println(Thread.currentThread().getId()); 27 num--; 28 System.out.println("---出售一个,剩余"+num+"个资源"); 29 } 30 } 31 32 }
ThreadResource类内有两个方法,用来实现资源互斥,两种方法机制相同都是使用同步锁,表现形式不同,推荐使用第二种sell2()方法。执行一次sell()方法,num做减一操作。
2.创建多线程,执行抢占资源,线程获取对象后调用sell()方法。
1 package com.bluej.javaj.thread.first; 2 3 public class ThreadMethod { 4 5 //使用static、final是为了让线程可以直接拿到对象,无须传参 6 private static final ThreadResource threadResource= new ThreadResource(); 7 8 public static void main(String[] args) { 9 for (int i = 0; i < 20; i++) { 10 //使用for遍历创建多个线程,并在线程内执行threadResource.sell() 11 new Thread(new Runnable() { 12 @Override 13 public void run() { 14 threadResource.sell(); 15 } 16 }).start(); 17 } 18 } 19 }