Java中利用synchronized关键字实现多线程同步问题(2)

从第二段代码可知,同步的关键是多个线程对象竞争同一个共享资源即可,上面的代码中是通过外部创建共享资源,然后传递到线程中来实现。我们也可以利用类成员变量被所有类的实例所共享这一特性,因此可以将lock用静态成员对象来实现,代码如下所示:修改MyThread.java类如下

package com.clark.thread;

public class MyThread implements Runnable{
 private int threadId;
 private static Object object = new Object();//线程之间竞争使用的对象锁
 public MyThread(int id){
  this.threadId = id;
 }
 @Override
 public  void run() {
  <strong>/**
  * 将这个object对象的引用传递给每一个线程对象的lock成员变量
  * 从而每个线程的lock成员都指向同一个Object对象
  * 这样就可以让线程去竞争这个唯一的共享的对象锁,从而实现同步。
  */</strong>
  synchronized(object){
   for (int i = 0; i < 100; i++) {
    if(i % 10 ==0){
     System.out.println();
    }
    System.out.print("Thread ID:"+this.threadId+":"+i+" ");
   }
  }
 }

}

结果如下:

Thread ID:0:0 Thread ID:0:1 Thread ID:0:2 Thread ID:0:3 Thread ID:0:4 Thread ID:0:5 Thread ID:0:6 Thread ID:0:7 Thread ID:0:8 Thread ID:0:9
Thread ID:0:10 Thread ID:0:11 Thread ID:0:12 Thread ID:0:13 Thread ID:0:14 Thread ID:0:15 Thread ID:0:16 Thread ID:0:17 Thread ID:0:18 Thread ID:0:19
Thread ID:0:20 Thread ID:0:21 Thread ID:0:22 Thread ID:0:23 Thread ID:0:24 Thread ID:0:25 Thread ID:0:26 Thread ID:0:27 Thread ID:0:28 Thread ID:0:29
Thread ID:0:30 Thread ID:0:31 Thread ID:0:32 Thread ID:0:33 Thread ID:0:34 Thread ID:0:35 Thread ID:0:36 Thread ID:0:37 Thread ID:0:38 Thread ID:0:39

再来看第一段代码,实例方法中加入sychronized关键字封锁的是this对象本身,而在静态方法中加入sychronized关键字封锁的就是类本身。静态方法是所有类实例对象所共享的,因此线程对象在访问此静态方法时是互斥访问的,从而可以实现线程的同步,代码如下所示:

package com.clark.thread;

public class MyThread implements Runnable{
 private int threadId;
 public MyThread(int id){
  this.threadId = id;
 }
 @Override
 public  void run() {
  start(this.threadId);
 }
 private static synchronized void start(int threadId2) {
  for (int i = 0; i < 100; i++) {
   if(i % 10 == 0){
    System.out.println();
   }
   System.out.print("Thread ID:"+threadId2+":"+i+" ");
  }
 }

}

结果如下=========

Thread ID:0:0 Thread ID:0:1 Thread ID:0:2 Thread ID:0:3 Thread ID:0:4 Thread ID:0:5 Thread ID:0:6 Thread ID:0:7 Thread ID:0:8 Thread ID:0:9 Thread ID:0:10 Thread ID:0:11 Thread ID:0:12 Thread ID:0:13 Thread ID:0:14 Thread ID:0:15 Thread ID:0:16 Thread ID:0:17 Thread ID:0:18 Thread ID:0:19 Thread ID:0:20 Thread ID:0:21 Thread ID:0:22 Thread ID:0:23 Thread ID:0:24 Thread ID:0:25 Thread ID:0:26 Thread ID:0:27 Thread ID:0:28 Thread ID:0:29 Thread ID:0:30 Thread ID:0:31 Thread ID:0:32 Thread ID:0:33 Thread ID:0:34 Thread ID:0:35 Thread ID:0:36 Thread ID:0:37 Thread ID:0:38 Thread ID:0:39 Thread ID:0:40 Thread ID:0:41 Thread ID:0:42 Thread ID:0:43 Thread ID:0:44 Thread ID:0:45 Thread ID:0:46 Thread ID:0:47 Thread ID:0:48 Thread ID:0:49 Thread ID:0:50 Thread ID:0:51 Thread ID:0:52 Thread ID:0:53 Thread ID:0:54 Thread ID:0:55 Thread ID:0:56 Thread ID:0:57 Thread ID:0:58 Thread ID:0:59

Java1.5后的多线程框架

Java多线程和同步的理解

Java中两种实现多线程方式的对比分析

Java利用多线程计算目录数据大小

Java多线程向数据库写入数据

Java多线程经典案例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/fecea48ca269f7c248f280afa2c0f3b1.html