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