线程的同步

1.线程同步   博客园   基本参考  洞庭散人《浅谈java多线程的同步问题》
 
我们在使用多线程打印出一组数据会比较的混乱,所以在这里就引入了线程同步的概念。 java中使用关键字synchronized来实现线程的同步。当一个方法或者对象用synchronized修饰的时候,表明该方法或者对象在任意时刻只能由一个线程进行访问,其他线程只要调用CPU控制权且引起阻塞的原因消除后,才能被调用。
当一个方法或者对象使用synchronized关键字声明时,系统就为其设置一特殊的内部标记,称为锁,当一个线程调用该方法或对象的时候,系统都会检查锁是否已经给其他线程了,如果没有,系统就把该锁给它,如果该锁已经被其他线程占用了,那么该线程就要等到锁被释放以后,才能访问该方法。有时,需要暂时释放锁,使得其他线程可以调用同步方法,这事就可以利用wait()方法来实现。wait()方法可以使持有锁的线程暂时释放锁,直到其他线程通过notify方法使他重新获得该锁为止。

  java语言中的线程同步通常有方法同步和对象同步两种情况,下面详细阐述这两种线程的同步情况。

1.方法同步
  一个类中的任何方法都可以设计成为synchronized方法。下面通过一个例子来说明线程是如何同步的(代码手写,没调试,有错误自行改正).

public class Mymain {
   public static void main(String[] args)
   {   
    for(int i=0;i<10;i++){
        new Thread(new MyThread(i)).start();
        new Thread(new MyThread(i)).start();
     }
   }
   public synchronized static void save(int id)
   {
    try {
   Thread.sleep(2000);
   System.out.println(id);
     } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
   }
   }
class MyThread implements Runnable
{
  private int Str;
 public MyThread(int s)
 {
  this.Str=s;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
   Mymain.save(Str);
}
}

2.对象同步
  synchronized除了像上面讲的放在方法前面表示整个方法为同步之外,还可以放在对象前面限制一段代码的执行,实现对象的同步(代码手写,没调试,有错误自行改正).

public class Mymain {
   public static void main(String[] args)
   { Object obj=new Object();
    for(int i=0;i<10;i++){
     new Thread(new MyThread(i,obj)).start();
     new Thread(new MyThread(i,obj)).start();
    }
   }
   }
class MyThread implements Runnable
{
  private int Str;
  private Object obj;
 public MyThread(int s,Object obj)
 {
  this.Str=s;
  this.obj=obj;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  synchronized (obj) {
 
  try {
    Thread.sleep(2000);
    System.out.println(Str);
       } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
 }   
  }
}

   线程同步的两种基本方法在这里就介绍完了,如果想了解更多的线程同步方法大家可以去百度上搜搜,可以看到方法还是多种多样的,我们学习不在学的多,而在于精,以后可以熟练的使用即可。  线程既然有同步操作那么大家很容易想到线程的异步吧。请看下一章 异步线程。 
}

既然选择了远方,便只顾风雨兼程
原文地址:https://www.cnblogs.com/zhousen34/p/4732523.html