java线程学习(二)

时间:2021-10-13 18:28:32

多个线程并发抢占资源是,就会存在线程并发问题,造成实际资源与预期不符合的情况。这个时候需要设置“资源互斥”。

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 线程示例