java线程学习(二)

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

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代码示例

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

 

posted on 2017-03-09 19:19  bluej  阅读(115)  评论(0编辑  收藏  举报

导航