• 线程的同步


    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();
     }   
      }
    }

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

    既然选择了远方,便只顾风雨兼程
  • 相关阅读:
    (译).NET4.X并行任务Task需要释放吗?
    微软面向高并发应用而推出的新程序库——TPL Dataflow
    C# 5.0 Async函数的提示和技巧
    内存泄露——文章
    AJAX POST请求中参数以form data和request payload形式在php中的获取方式
    NodeJS中间层搭建
    HTML5上传预览
    laravel 图片上传 ajax 方式
    抽奖程序
    IText 生成页脚页码
  • 原文地址:https://www.cnblogs.com/zhousen34/p/4732523.html
Copyright © 2020-2023  润新知