【Java基础】多线程之synchronized

来源:互联网 发布:yum install CMake 编辑:程序博客网 时间:2024/05/16 05:54

为什么要用synchronized


          多线程可以提高效率,但是在共享变量的情况下,可能出现混乱的情况,比如A线程将共享变量 m=5,但是B线程在用m变量的时候,出现了混乱。这样多个线程共同访问同样的一个资源,你争我夺,一团乱。线程的不安全现象一触即发。所以必须要对这种资源冲突进行预防。

      所以,在共同访问的资源进行加锁即可,第一种方法就是同步锁,也即用关键字synchronized。该关键字可以加在方法和语句块中,也即是同步方法和同步语句块。

synchronized原理

           各个线程在调用关键字synchronized方法或者语句块的时候,需要排队进行。当A线程在调用该方法(或者语句块)的时候,要在该方法(或者语句块)上锁,B线程则等待,当然可以以异步的方法调用非synchronized方法。当A线程释放了synchronized方法(或者语句块),B线程才可以调用该方法。
    
       synchronized关键字还可以实现可重入锁,也就是一个线程连续几次获取同一把锁。

案例分析


      首先是方法类,代码如下:

package cn.itcast.java.base.synchronize;public class Task{  public void doLongTimeTask()  {  for (int i = 0; i < 100; i++){System.out.println("nosynchronized threadName="+Thread.currentThread().getName()+"i="+(i+1));}  System.out.println("");  synchronized (this){for (int i = 0; i < 100; i++){System.out.println("synchronized threadName="+Thread.currentThread().getName()+"i="+(i+1));}}  }}

      接下来是自定义的线程类,这里一共有2个线程:

package cn.itcast.java.base.synchronize;public class MyThread1 extends Thread{  private Task task;  public MyThread1(Task task){  super();  this.task=task;  } public void run(){ super.run(); task.doLongTimeTask(); }  }

package cn.itcast.java.base.synchronize;public class MyThread2 extends Thread{  private Task task;  public MyThread2(Task task){  super();  this.task=task;  } public void run(){ super.run(); task.doLongTimeTask(); }  }


    接下来是run方法:

    
package cn.itcast.java.base.synchronize;public class Run{ public static void main(String[] args){Task task=new Task();MyThread1 thread1=new MyThread1(task);thread1.start();MyThread2 thread2=new MyThread2(task);thread2.start();}}
   
     我们看一下运行结果:

     
nosynchronized threadName=Thread-0i=1nosynchronized threadName=Thread-1i=1nosynchronized threadName=Thread-0i=2nosynchronized threadName=Thread-1i=2nosynchronized threadName=Thread-0i=3nosynchronized threadName=Thread-1i=3nosynchronized threadName=Thread-0i=4nosynchronized threadName=Thread-1i=4nosynchronized threadName=Thread-0i=5nosynchronized threadName=Thread-1i=5nosynchronized threadName=Thread-0i=6nosynchronized threadName=Thread-1i=6nosynchronized threadName=Thread-0i=7nosynchronized threadName=Thread-0i=8nosynchronized threadName=Thread-0i=9nosynchronized threadName=Thread-1i=7nosynchronized threadName=Thread-0i=10nosynchronized threadName=Thread-1i=8nosynchronized threadName=Thread-0i=11nosynchronized threadName=Thread-0i=12nosynchronized threadName=Thread-0i=13nosynchronized threadName=Thread-1i=9nosynchronized threadName=Thread-0i=14nosynchronized threadName=Thread-1i=10nosynchronized threadName=Thread-0i=15nosynchronized threadName=Thread-1i=11nosynchronized threadName=Thread-0i=16nosynchronized threadName=Thread-0i=17nosynchronized threadName=Thread-0i=18nosynchronized threadName=Thread-0i=19nosynchronized threadName=Thread-0i=20nosynchronized threadName=Thread-0i=21nosynchronized threadName=Thread-0i=22nosynchronized threadName=Thread-0i=23nosynchronized threadName=Thread-0i=24nosynchronized threadName=Thread-0i=25nosynchronized threadName=Thread-0i=26nosynchronized threadName=Thread-0i=27nosynchronized threadName=Thread-0i=28nosynchronized threadName=Thread-0i=29nosynchronized threadName=Thread-1i=12nosynchronized threadName=Thread-0i=30nosynchronized threadName=Thread-1i=13nosynchronized threadName=Thread-0i=31nosynchronized threadName=Thread-1i=14nosynchronized threadName=Thread-0i=32nosynchronized threadName=Thread-1i=15nosynchronized threadName=Thread-0i=33nosynchronized threadName=Thread-1i=16nosynchronized threadName=Thread-0i=34nosynchronized threadName=Thread-1i=17nosynchronized threadName=Thread-0i=35nosynchronized threadName=Thread-1i=18nosynchronized threadName=Thread-0i=36nosynchronized threadName=Thread-1i=19nosynchronized threadName=Thread-0i=37nosynchronized threadName=Thread-0i=38nosynchronized threadName=Thread-1i=20nosynchronized threadName=Thread-0i=39nosynchronized threadName=Thread-1i=21nosynchronized threadName=Thread-0i=40nosynchronized threadName=Thread-1i=22nosynchronized threadName=Thread-0i=41nosynchronized threadName=Thread-1i=23nosynchronized threadName=Thread-0i=42nosynchronized threadName=Thread-1i=24nosynchronized threadName=Thread-0i=43nosynchronized threadName=Thread-1i=25nosynchronized threadName=Thread-0i=44nosynchronized threadName=Thread-1i=26nosynchronized threadName=Thread-0i=45nosynchronized threadName=Thread-1i=27nosynchronized threadName=Thread-0i=46nosynchronized threadName=Thread-1i=28nosynchronized threadName=Thread-0i=47nosynchronized threadName=Thread-1i=29nosynchronized threadName=Thread-0i=48nosynchronized threadName=Thread-1i=30nosynchronized threadName=Thread-0i=49nosynchronized threadName=Thread-0i=50nosynchronized threadName=Thread-1i=31nosynchronized threadName=Thread-1i=32nosynchronized threadName=Thread-1i=33nosynchronized threadName=Thread-1i=34nosynchronized threadName=Thread-0i=51nosynchronized threadName=Thread-1i=35nosynchronized threadName=Thread-0i=52nosynchronized threadName=Thread-1i=36nosynchronized threadName=Thread-0i=53nosynchronized threadName=Thread-0i=54nosynchronized threadName=Thread-0i=55nosynchronized threadName=Thread-0i=56nosynchronized threadName=Thread-0i=57nosynchronized threadName=Thread-0i=58nosynchronized threadName=Thread-0i=59nosynchronized threadName=Thread-0i=60nosynchronized threadName=Thread-0i=61nosynchronized threadName=Thread-0i=62nosynchronized threadName=Thread-1i=37nosynchronized threadName=Thread-0i=63nosynchronized threadName=Thread-1i=38nosynchronized threadName=Thread-0i=64nosynchronized threadName=Thread-1i=39nosynchronized threadName=Thread-0i=65nosynchronized threadName=Thread-1i=40nosynchronized threadName=Thread-0i=66nosynchronized threadName=Thread-1i=41nosynchronized threadName=Thread-0i=67nosynchronized threadName=Thread-1i=42nosynchronized threadName=Thread-0i=68nosynchronized threadName=Thread-1i=43nosynchronized threadName=Thread-0i=69nosynchronized threadName=Thread-1i=44nosynchronized threadName=Thread-0i=70nosynchronized threadName=Thread-1i=45nosynchronized threadName=Thread-0i=71nosynchronized threadName=Thread-1i=46nosynchronized threadName=Thread-0i=72nosynchronized threadName=Thread-1i=47nosynchronized threadName=Thread-1i=48nosynchronized threadName=Thread-1i=49nosynchronized threadName=Thread-1i=50nosynchronized threadName=Thread-1i=51nosynchronized threadName=Thread-0i=73nosynchronized threadName=Thread-1i=52nosynchronized threadName=Thread-0i=74nosynchronized threadName=Thread-1i=53nosynchronized threadName=Thread-0i=75nosynchronized threadName=Thread-1i=54nosynchronized threadName=Thread-0i=76nosynchronized threadName=Thread-0i=77nosynchronized threadName=Thread-0i=78nosynchronized threadName=Thread-0i=79nosynchronized threadName=Thread-0i=80nosynchronized threadName=Thread-1i=55nosynchronized threadName=Thread-0i=81nosynchronized threadName=Thread-0i=82nosynchronized threadName=Thread-1i=56nosynchronized threadName=Thread-0i=83nosynchronized threadName=Thread-1i=57nosynchronized threadName=Thread-1i=58nosynchronized threadName=Thread-0i=84nosynchronized threadName=Thread-1i=59nosynchronized threadName=Thread-0i=85nosynchronized threadName=Thread-1i=60nosynchronized threadName=Thread-0i=86nosynchronized threadName=Thread-1i=61nosynchronized threadName=Thread-0i=87nosynchronized threadName=Thread-1i=62nosynchronized threadName=Thread-0i=88nosynchronized threadName=Thread-1i=63nosynchronized threadName=Thread-0i=89nosynchronized threadName=Thread-1i=64nosynchronized threadName=Thread-0i=90nosynchronized threadName=Thread-1i=65nosynchronized threadName=Thread-0i=91nosynchronized threadName=Thread-1i=66nosynchronized threadName=Thread-0i=92nosynchronized threadName=Thread-1i=67nosynchronized threadName=Thread-0i=93nosynchronized threadName=Thread-1i=68nosynchronized threadName=Thread-0i=94nosynchronized threadName=Thread-1i=69nosynchronized threadName=Thread-0i=95nosynchronized threadName=Thread-1i=70nosynchronized threadName=Thread-0i=96nosynchronized threadName=Thread-1i=71nosynchronized threadName=Thread-0i=97nosynchronized threadName=Thread-1i=72nosynchronized threadName=Thread-0i=98nosynchronized threadName=Thread-1i=73nosynchronized threadName=Thread-0i=99nosynchronized threadName=Thread-1i=74nosynchronized threadName=Thread-0i=100nosynchronized threadName=Thread-1i=75nosynchronized threadName=Thread-1i=76synchronized threadName=Thread-0i=1nosynchronized threadName=Thread-1i=77synchronized threadName=Thread-0i=2nosynchronized threadName=Thread-1i=78synchronized threadName=Thread-0i=3synchronized threadName=Thread-0i=4synchronized threadName=Thread-0i=5nosynchronized threadName=Thread-1i=79synchronized threadName=Thread-0i=6nosynchronized threadName=Thread-1i=80synchronized threadName=Thread-0i=7nosynchronized threadName=Thread-1i=81synchronized threadName=Thread-0i=8synchronized threadName=Thread-0i=9synchronized threadName=Thread-0i=10synchronized threadName=Thread-0i=11synchronized threadName=Thread-0i=12synchronized threadName=Thread-0i=13synchronized threadName=Thread-0i=14synchronized threadName=Thread-0i=15synchronized threadName=Thread-0i=16synchronized threadName=Thread-0i=17synchronized threadName=Thread-0i=18synchronized threadName=Thread-0i=19synchronized threadName=Thread-0i=20synchronized threadName=Thread-0i=21synchronized threadName=Thread-0i=22synchronized threadName=Thread-0i=23nosynchronized threadName=Thread-1i=82synchronized threadName=Thread-0i=24nosynchronized threadName=Thread-1i=83synchronized threadName=Thread-0i=25nosynchronized threadName=Thread-1i=84synchronized threadName=Thread-0i=26nosynchronized threadName=Thread-1i=85synchronized threadName=Thread-0i=27nosynchronized threadName=Thread-1i=86synchronized threadName=Thread-0i=28nosynchronized threadName=Thread-1i=87synchronized threadName=Thread-0i=29nosynchronized threadName=Thread-1i=88synchronized threadName=Thread-0i=30synchronized threadName=Thread-0i=31synchronized threadName=Thread-0i=32synchronized threadName=Thread-0i=33nosynchronized threadName=Thread-1i=89synchronized threadName=Thread-0i=34nosynchronized threadName=Thread-1i=90synchronized threadName=Thread-0i=35nosynchronized threadName=Thread-1i=91synchronized threadName=Thread-0i=36nosynchronized threadName=Thread-1i=92synchronized threadName=Thread-0i=37nosynchronized threadName=Thread-1i=93synchronized threadName=Thread-0i=38nosynchronized threadName=Thread-1i=94nosynchronized threadName=Thread-1i=95nosynchronized threadName=Thread-1i=96nosynchronized threadName=Thread-1i=97synchronized threadName=Thread-0i=39nosynchronized threadName=Thread-1i=98synchronized threadName=Thread-0i=40nosynchronized threadName=Thread-1i=99synchronized threadName=Thread-0i=41nosynchronized threadName=Thread-1i=100synchronized threadName=Thread-0i=42synchronized threadName=Thread-0i=43synchronized threadName=Thread-0i=44synchronized threadName=Thread-0i=45synchronized threadName=Thread-0i=46synchronized threadName=Thread-0i=47synchronized threadName=Thread-0i=48synchronized threadName=Thread-0i=49synchronized threadName=Thread-0i=50synchronized threadName=Thread-0i=51synchronized threadName=Thread-0i=52synchronized threadName=Thread-0i=53synchronized threadName=Thread-0i=54synchronized threadName=Thread-0i=55synchronized threadName=Thread-0i=56synchronized threadName=Thread-0i=57synchronized threadName=Thread-0i=58synchronized threadName=Thread-0i=59synchronized threadName=Thread-0i=60synchronized threadName=Thread-0i=61synchronized threadName=Thread-0i=62synchronized threadName=Thread-0i=63synchronized threadName=Thread-0i=64synchronized threadName=Thread-0i=65synchronized threadName=Thread-0i=66synchronized threadName=Thread-0i=67synchronized threadName=Thread-0i=68synchronized threadName=Thread-0i=69synchronized threadName=Thread-0i=70synchronized threadName=Thread-0i=71synchronized threadName=Thread-0i=72synchronized threadName=Thread-0i=73synchronized threadName=Thread-0i=74synchronized threadName=Thread-0i=75synchronized threadName=Thread-0i=76synchronized threadName=Thread-0i=77synchronized threadName=Thread-0i=78synchronized threadName=Thread-0i=79synchronized threadName=Thread-0i=80synchronized threadName=Thread-0i=81synchronized threadName=Thread-0i=82synchronized threadName=Thread-0i=83synchronized threadName=Thread-0i=84synchronized threadName=Thread-0i=85synchronized threadName=Thread-0i=86synchronized threadName=Thread-0i=87synchronized threadName=Thread-0i=88synchronized threadName=Thread-0i=89synchronized threadName=Thread-0i=90synchronized threadName=Thread-0i=91synchronized threadName=Thread-0i=92synchronized threadName=Thread-0i=93synchronized threadName=Thread-0i=94synchronized threadName=Thread-0i=95synchronized threadName=Thread-0i=96synchronized threadName=Thread-0i=97synchronized threadName=Thread-0i=98synchronized threadName=Thread-0i=99synchronized threadName=Thread-0i=100synchronized threadName=Thread-1i=1synchronized threadName=Thread-1i=2synchronized threadName=Thread-1i=3synchronized threadName=Thread-1i=4synchronized threadName=Thread-1i=5synchronized threadName=Thread-1i=6synchronized threadName=Thread-1i=7synchronized threadName=Thread-1i=8synchronized threadName=Thread-1i=9synchronized threadName=Thread-1i=10synchronized threadName=Thread-1i=11synchronized threadName=Thread-1i=12synchronized threadName=Thread-1i=13synchronized threadName=Thread-1i=14synchronized threadName=Thread-1i=15synchronized threadName=Thread-1i=16synchronized threadName=Thread-1i=17synchronized threadName=Thread-1i=18synchronized threadName=Thread-1i=19synchronized threadName=Thread-1i=20synchronized threadName=Thread-1i=21synchronized threadName=Thread-1i=22synchronized threadName=Thread-1i=23synchronized threadName=Thread-1i=24synchronized threadName=Thread-1i=25synchronized threadName=Thread-1i=26synchronized threadName=Thread-1i=27synchronized threadName=Thread-1i=28synchronized threadName=Thread-1i=29synchronized threadName=Thread-1i=30synchronized threadName=Thread-1i=31synchronized threadName=Thread-1i=32synchronized threadName=Thread-1i=33synchronized threadName=Thread-1i=34synchronized threadName=Thread-1i=35synchronized threadName=Thread-1i=36synchronized threadName=Thread-1i=37synchronized threadName=Thread-1i=38synchronized threadName=Thread-1i=39synchronized threadName=Thread-1i=40synchronized threadName=Thread-1i=41synchronized threadName=Thread-1i=42synchronized threadName=Thread-1i=43synchronized threadName=Thread-1i=44synchronized threadName=Thread-1i=45synchronized threadName=Thread-1i=46synchronized threadName=Thread-1i=47synchronized threadName=Thread-1i=48synchronized threadName=Thread-1i=49synchronized threadName=Thread-1i=50synchronized threadName=Thread-1i=51synchronized threadName=Thread-1i=52synchronized threadName=Thread-1i=53synchronized threadName=Thread-1i=54synchronized threadName=Thread-1i=55synchronized threadName=Thread-1i=56synchronized threadName=Thread-1i=57synchronized threadName=Thread-1i=58synchronized threadName=Thread-1i=59synchronized threadName=Thread-1i=60synchronized threadName=Thread-1i=61synchronized threadName=Thread-1i=62synchronized threadName=Thread-1i=63synchronized threadName=Thread-1i=64synchronized threadName=Thread-1i=65synchronized threadName=Thread-1i=66synchronized threadName=Thread-1i=67synchronized threadName=Thread-1i=68synchronized threadName=Thread-1i=69synchronized threadName=Thread-1i=70synchronized threadName=Thread-1i=71synchronized threadName=Thread-1i=72synchronized threadName=Thread-1i=73synchronized threadName=Thread-1i=74synchronized threadName=Thread-1i=75synchronized threadName=Thread-1i=76synchronized threadName=Thread-1i=77synchronized threadName=Thread-1i=78synchronized threadName=Thread-1i=79synchronized threadName=Thread-1i=80synchronized threadName=Thread-1i=81synchronized threadName=Thread-1i=82synchronized threadName=Thread-1i=83synchronized threadName=Thread-1i=84synchronized threadName=Thread-1i=85synchronized threadName=Thread-1i=86synchronized threadName=Thread-1i=87synchronized threadName=Thread-1i=88synchronized threadName=Thread-1i=89synchronized threadName=Thread-1i=90synchronized threadName=Thread-1i=91synchronized threadName=Thread-1i=92synchronized threadName=Thread-1i=93synchronized threadName=Thread-1i=94synchronized threadName=Thread-1i=95synchronized threadName=Thread-1i=96synchronized threadName=Thread-1i=97synchronized threadName=Thread-1i=98synchronized threadName=Thread-1i=99synchronized threadName=Thread-1i=100
    

          用synchronized(this)来锁定当前对象,通过语句块来进行同步。
     
       
        

  
原创粉丝点击