java synchronized(object/this)的 區別

1.synchronized(object)java

package test.thread;

import java.io.IOException;

import org.junit.Test;

/*
 * 測試線程鎖
 */
public class TestBlock {
      
        public static void main(String[] args)  {
            TestBlock test = new TestBlock();
            MyTest thread1 = test.new MyTest(test);
            thread1.setName("1");
            MyTest thread2 = test.new MyTest(test);
            thread2.setName("2");
            thread1.start();
            thread2.start();
        }  
    /*
     * 測試同步
     */
    class MyTest extends Thread{
        private Object o;
        
        public  MyTest(Object o){
            this.o=o; }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (o) {  //這個o是test對象的實例 ,對類對象實例進行加鎖,當線程調用一個實例運行的,另外的線程調用這個實例時候阻塞,達到上鎖的目的 try {
                    for(int a=0;a<3;a++){
                        System.out.println("線程"+MyTest.currentThread().getName()+"修改a=="+a);
                        //MyTest.yield();
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        }
        
    }    
    
}

返回的結果:
  ·    
  

     

線程1修改a==0
線程1修改a==1
線程1修改a==2
線程1修改a==3
線程1修改a==4
線程1修改a==5
線程1修改a==6
線程1修改a==7
線程1修改a==8
線程1修改a==9
線程2修改a==0
線程2修改a==1
線程2修改a==2
線程2修改a==3
線程2修改a==4
線程2修改a==5
線程2修改a==6
線程2修改a==7
線程2修改a==8
線程2修改a==9ide

能夠看到當一個線程運行完畢以後才運行第二個線程

2.synchronized(this)測試

package test.thread;

import java.io.IOException;

import org.junit.Test;

/*
 * 測試線程鎖
 */
public class TestBlock {   //調用類 public static void main(String[] args)  {
            TestBlock test = new TestBlock();
            MyTest thread1 = test.new MyTest(test);
            thread1.setName("1");
            MyTest thread2 = test.new MyTest(test);
            thread2.setName("2");
            thread1.start();
            thread2.start();
        }  
    /*
     * 測試同步
     */
    class MyTest extends Thread{
        private Object o;
        
        public  MyTest(Object o){
            this.o=o;
        }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (this) {  //this 指代當時類 也就是MyTest,兩個線程同時調用同一個類方法。就是兩個線程對兩個實例的各自上鎖。互相不阻塞
try { for(int a=0;a<10;a++){ System.out.println("線程"+MyTest.currentThread().getName()+"修改a=="+a); //MyTest.yield();  } } catch (Exception e) { // TODO: handle exception  } } } } }

返回的結果:

線程1修改a==0
線程1修改a==1
線程1修改a==2
線程1修改a==3
線程1修改a==4
線程2修改a==0
線程1修改a==5
線程1修改a==6
線程1修改a==7
線程1修改a==8
線程1修改a==9
線程2修改a==1
線程2修改a==2
線程2修改a==3
線程2修改a==4
線程2修改a==5
線程2修改a==6
線程2修改a==7
線程2修改a==8
線程2修改a==9this

相關文章
相關標籤/搜索