欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于使用ContextClassLoader遇到的問題

 更新時(shí)間:2023年10月07日 09:52:59   作者:sunct  
這篇文章主要介紹了關(guān)于使用ContextClassLoader遇到的問題,ContextClassLoader是通過Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下

關(guān)于使用ContextClassLoader遇到的問題

對(duì)ContextClassLoader有一些疑惑:

  1. 父線程加載的Class,子線程是否可以使用該Class? 答:可以
  2. 子線程加載的Class,父線程是否可以使用該Class? 答:不可以
  3. 如果一個(gè)線程加載的Class,其他線程是否可以使用該Class ? 答:不可以
  4. 怎么使用ContextClassLoader才是正確姿勢(shì)呢? 答:取出->更改->還原(finally語句塊)。

關(guān)于上述4點(diǎn)疑問,做了以下測(cè)試:

父線程加載的Class,子線程是否可以使用該Class?

/**
 * Thread.currentThread().setContextClassLoader
 * 如果父線程加載了某個(gè)class, 那么子線程也可以使用該class
 */
public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        ClassLoader ccl = Thread.currentThread().getContextClassLoader();
        MyClassLoader classLoader = new MyClassLoader();
            classLoader.setClassFile(new File("D:\\UserService3Impl.class"));
            Thread.currentThread().setContextClassLoader(classLoader);
            try {
                classLoader.loadClass("com.sample.mybatis.service.impl.UserService3Impl");
            } catch (Exception e) {
                e.printStackTrace();
            }
        Thread thread = new Thread(() -> {
            try {
                Class<?> userClass = Thread.currentThread().getContextClassLoader().loadClass("com.sample.mybatis.service.impl.UserService3Impl");
                System.out.println(userClass);
                UserService3 userObj = (UserService3)userClass.newInstance();
                System.out.println(Thread.currentThread().getName() + " ==> " + userObj.getUserNo());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
         thread.start();
    }
}

運(yùn)行結(jié)果:

在這里插入圖片描述

結(jié)論:父線程加載的Class,子線程是可以使用該Class

子線程加載的Class,父線程是否可以使用該Class?

/**
 * Thread.currentThread().setContextClassLoader
 * 如果子線程加載了某個(gè)class, 那么父線程不能共享到該class
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(() -> {
            try {
                MyClassLoader classLoader = new MyClassLoader();
                classLoader.setClassFile(new File("D:\\UserService3Impl.class"));
                Thread.currentThread().setContextClassLoader(classLoader);
                try {
                    classLoader.loadClass("com.sample.mybatis.service.impl.UserService3Impl");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        thread.start();
        thread.join();
        Class<?> userClass = Thread.currentThread().getContextClassLoader().loadClass("com.sample.mybatis.service.impl.UserService3Impl");
        System.out.println(userClass);
        UserService3 userObj = (UserService3) userClass.newInstance();
        System.out.println(Thread.currentThread().getName() + " ==> " + userObj.getUserNo());
    }
}

運(yùn)行結(jié)果:

在這里插入圖片描述

結(jié)論:子線程加載的Class,父線程是不可以使用該Class

如果一個(gè)線程加載的Class,其他線程是否可以使用該Class?

測(cè)試代碼:

/**
 * 如果兩個(gè)線程不是父子線程, 線程之間不會(huì)共享加載過的class
 */
public class Test3 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            MyClassLoader classLoader = new MyClassLoader();
            classLoader.setClassFile(new File("D:\\UserService3Impl.class"));
            Thread.currentThread().setContextClassLoader(classLoader);
            Class<?> userClass = null;
            try {
                userClass = classLoader.loadClass("com.sample.mybatis.service.impl.UserService3Impl");
                System.out.println(userClass);
                UserService3 userObj = (UserService3) userClass.newInstance();
                System.out.println(Thread.currentThread().getName() + " ==> " + userObj.getUserNo());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        thread.start();
        thread.join();
        Thread thread2 = new Thread(() -> {
            try {
                Class<?> userClass = Thread.currentThread().getContextClassLoader().loadClass("com.sample.mybatis.service.impl.UserService3Impl");
                System.out.println(userClass);
                UserService3 userObj = (UserService3) userClass.newInstance();
                System.out.println(Thread.currentThread().getName() + " ==> " + userObj.getUserNo());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        thread2.start();
    }
}

運(yùn)行結(jié)果:

在這里插入圖片描述

總結(jié):如果一個(gè)線程加載的Class,其他線程是不可以使用該Class

怎么使用ContextClassLoader才是正確姿勢(shì)呢?

ClassLoader ccl = Thread.currentThread().getContextClassLoader(); //取出
try {
    MyClassLoader classLoader = new MyClassLoader();
    classLoader.setClassFile(new File("D:\\UserService3Impl.class"));
    Thread.currentThread().setContextClassLoader(classLoader); //設(shè)置
    //其他邏輯。。。
}finally {
    Thread.currentThread().setContextClassLoader(ccl); //還原
}

到此這篇關(guān)于關(guān)于使用ContextClassLoader遇到的問題的文章就介紹到這了,更多相關(guān)ContextClassLoader使用詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理

    Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理

    這篇文章主要介紹了Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java使用雪花id生成算法詳解

    Java使用雪花id生成算法詳解

    SnowFlake算法,是Twitter開源的分布式id生成算法,在2014年開源,開源的版本由scala編寫。其核心思想就是-使用一個(gè)64bit的long型的數(shù)字作為全局唯一id
    2022-12-12
  • Java編程思想對(duì)象的容納實(shí)例詳解

    Java編程思想對(duì)象的容納實(shí)例詳解

    這篇文章主要介紹了Java編程思想對(duì)象的容納實(shí)例詳解,內(nèi)容比較詳細(xì),涵蓋的東西也比較多,具有參考價(jià)值,需要的朋友了解下。
    2017-09-09
  • 淺談java 中equals和==的區(qū)別

    淺談java 中equals和==的區(qū)別

    這篇文章主要介紹了java 中equals和==的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java?讀寫?ini?配置文件的示例代碼

    java?讀寫?ini?配置文件的示例代碼

    這篇文章主要介紹了java?讀寫?ini?配置文件,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java并發(fā)編程線程間通訊實(shí)現(xiàn)過程詳解

    Java并發(fā)編程線程間通訊實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Java并發(fā)編程線程間通訊實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 帶你入門Java的集合

    帶你入門Java的集合

    Java的集合類型都是對(duì)java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結(jié)
    2021-07-07
  • SpringBoot通過@Value實(shí)現(xiàn)給靜態(tài)變量注入值詳解

    SpringBoot通過@Value實(shí)現(xiàn)給靜態(tài)變量注入值詳解

    這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java設(shè)計(jì)模式編程之工廠方法模式的使用

    Java設(shè)計(jì)模式編程之工廠方法模式的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程之工廠方法模式的使用,工廠方法模式屬于設(shè)計(jì)模式中三種工廠模式中的一種,需要的朋友可以參考下
    2016-02-02
  • 深入了解JAVA 軟引用

    深入了解JAVA 軟引用

    這篇文章主要介紹了JAVA 軟引用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論