zoukankan      html  css  js  c++  java
  • Java多线程可重入锁例子解析

    “可重入锁”的概念是:自己可以再次获得自己的内部锁。比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁。

    class sysTest{
        synchronized void test1(String str){
            System.out.println(str+"1");
            test2(str);
            System.out.println("end" + str);
        }
        
        synchronized void test2(String str){
            System.out.println(str+"2");
        }
    }
    
    class myThread extends Thread{
        String str = null;
        public myThread(String str) {
            this.str = str;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            new sysTest().test1(str);
        }
    }
    
    public class synchronizedTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            myThread th1 = new myThread("1str");
            myThread th2 = new myThread("2str");
            th1.start();
            th2.start();
        }
    
    }

     

    在加粗的sychronized在的时候结果会有下面,结果不唯一的:

    1str1

    2str1

    1str2

    2str2

    end2str

    end1str

    在加粗的sychronized去掉的时候结果会有下面,结果唯一的:

    1str1

    1str2

    end1str

    2str1

    2str2

    end2str

    在这里必须要认识到,加一个sychronized方法里调用sychronized方法会造成不同步,需要注意。原因是两个锁的问题,

    这个时候使用可重入概念解决的话,就要使用对象锁,因为在sychronized()代码块中再次获得该锁就会可以得到: 

    class sysTest{
        static Object object = new Object();
         void test1(String str){
             synchronized(object){
                 System.out.println(str+"1");
                    test2(str);
                    System.out.println("end" + str);
             }
            
        }
        
        void test2(String str){
            synchronized(object){
            System.out.println(str+"2");
            }
        }
    }
    
    class myThread extends Thread{
        String str = null;
        public myThread(String str) {
            this.str = str;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            new sysTest().test1(str);
        }
    }
    
    public class synchronizedTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            myThread th1 = new myThread("1str");
            myThread th2 = new myThread("2str");
            th1.start();
            th2.start();
        }
    
    }
    结果:
    1str1
    1str2
    end1str
    2str1
    2str2
    end2str
  • 相关阅读:
    为什么叫"鲁棒"图
    Linux系统信息查看命令......
    網頁配色工具
    java基础方面知识点
    網頁設計收藏站70個
    bj_linux...
    工具
    软件工程阅读(中英文对照)之软件维护
    软件工程新方法和技术简介(英文)
    软件工程阅读(中英文对照)之文档技术
  • 原文地址:https://www.cnblogs.com/ljy-1471914707/p/7944812.html
Copyright © 2011-2022 走看看