当前位置: 首页 > news >正文

自己建设网站怎么被百度收入今天实时热搜榜排名

自己建设网站怎么被百度收入,今天实时热搜榜排名,怎么样才能把网站关键词做有排名靠前,招聘信息网站开发背景log4j日志配置文件中的%X{TransId}是怎么动态获取值的 在Log4j中,%X{TransId} 是用来从MDC(Mapped Diagnostic Context)中获取值的占位符。MDC 是 Log4j 提供的一种机制,用于在同一个线程的不同日志记录中传递上下文信息。通过 M…

log4j日志配置文件中的%X{TransId}是怎么动态获取值的

在Log4j中,%X{TransId} 是用来从MDC(Mapped Diagnostic Context)中获取值的占位符。MDC 是 Log4j 提供的一种机制,用于在同一个线程的不同日志记录中传递上下文信息。通过 MDC,你可以在日志中添加一些动态的上下文信息,比如事务ID、用户ID等。

要动态设置 TransId 的值,你需要在代码中使用 MDC.put 方法。以下是一个示例:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;public class Log4jExample {private static final Logger logger = LogManager.getLogger(Log4jExample.class);public static void main(String[] args) {// 设置TransId的值ThreadContext.put("TransId", "12345");// 记录日志logger.info("This is a log message with TransId.");// 清除TransId的值ThreadContext.clearMap();}
}

在上面的代码中,我们使用 ThreadContext.put("TransId", "12345") 来设置 TransId 的值。然后在日志配置文件中使用 %X{TransId} 占位符来引用这个值。

例如,log4j2.xml 配置文件可以这样配置:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg %X{TransId}%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

在这个配置中,%X{TransId} 会被替换为 ThreadContextTransId 的值,即 12345

总结:通过在代码中使用 ThreadContext.put("TransId", "value") 方法设置 TransId 的值,然后在日志配置文件中使用 %X{TransId} 占位符来引用这个值,从而实现动态获取和记录 TransId

在Log4j 2中,ThreadContext 是用来替代 Log4j 1.x 中的 MDC 的。对于 Log4j 1.x,你需要使用 MDC.put 方法来设置上下文信息。以下是使用 Log4j 1.x 的示例:

import org.apache.log4j.Logger;
import org.apache.log4j.MDC;public class Log4jExample {private static final Logger logger = Logger.getLogger(Log4jExample.class);public static void main(String[] args) {// 设置TransId的值MDC.put("TransId", "12345");// 记录日志logger.info("This is a log message with TransId.");// 清除TransId的值MDC.clear();}
}

在上面的代码中,我们使用 MDC.put("TransId", "12345") 来设置 TransId 的值。然后在日志配置文件中使用 %X{TransId} 占位符来引用这个值。

例如,log4j.properties 配置文件可以这样配置:

log4j.rootLogger=INFO, Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1} - %m %X{TransId}%n

在这个配置中,%X{TransId} 会被替换为 MDCTransId 的值,即 12345

总结:对于 Log4j 1.x,通过在代码中使用 MDC.put("TransId", "value") 方法设置 TransId 的值,然后在日志配置文件中使用 %X{TransId} 占位符来引用这个值,从而实现动态获取和记录 TransId。对于 Log4j 2.x,使用 ThreadContext.put 方法来实现相同的功能。

ThreadLocal 是 Java 提供的一种机制,用于在每个线程中存储独立的变量副本。它可以确保变量在多线程环境下的线程安全性,而不需要显式的同步。每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。

ThreadLocal 的基本原理

  1. 独立副本:每个线程都有一个独立的变量副本,这些副本存储在 ThreadLocal 对象中。每个线程对其副本的修改不会影响其他线程的副本。

  2. 内部存储ThreadLocal 通过 Thread 类中的一个内部 ThreadLocalMap 来存储每个线程的变量副本。ThreadLocalMap 是一个自定义的哈希表,键是 ThreadLocal 对象,值是线程的变量副本。

  3. 访问机制:当线程访问 ThreadLocal 变量时,ThreadLocal 会根据当前线程获取对应的变量副本。如果当前线程没有对应的副本,ThreadLocal 会创建一个新的副本并存储在 ThreadLocalMap 中。

ThreadLocal 的主要方法

  • get():返回当前线程的变量副本。如果当前线程没有对应的副本,则调用 initialValue() 方法创建一个新的副本。
  • set(T value):设置当前线程的变量副本。
  • remove():移除当前线程的变量副本,防止内存泄漏。

示例代码

以下是一个简单的示例,展示了如何使用 ThreadLocal

public class ThreadLocalExample {// 创建一个ThreadLocal变量private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);public static void main(String[] args) {// 创建两个线程Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {threadLocal.set(threadLocal.get() + 1);System.out.println(Thread.currentThread().getName() + " - " + threadLocal.get());}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 5; i++) {threadLocal.set(threadLocal.get() + 1);System.out.println(Thread.currentThread().getName() + " - " + threadLocal.get());}});thread1.start();thread2.start();}
}

在这个示例中,每个线程都有一个独立的 ThreadLocal 变量副本,互不干扰。

内部实现

ThreadLocal 的内部实现主要依赖于 ThreadLocalMap,这是一个自定义的哈希表,存储在每个线程的 Thread 对象中。以下是一些关键点:

  1. ThreadLocalMapThreadLocalMapThreadLocal 的静态内部类,用于存储每个线程的变量副本。它使用 ThreadLocal 对象作为键,变量副本作为值。

  2. EntryThreadLocalMap 中的每个条目是一个 Entry 对象,包含一个弱引用的 ThreadLocal 键和一个强引用的值。

  3. 垃圾回收:由于 ThreadLocal 键是弱引用,当 ThreadLocal 对象被垃圾回收时,ThreadLocalMap 中对应的条目会被自动清除,防止内存泄漏。

内存泄漏问题

使用 ThreadLocal 时需要注意内存泄漏问题。由于 ThreadLocalMap 中的键是弱引用,但值是强引用,如果不显式调用 remove() 方法,可能会导致内存泄漏。因此,建议在使用完 ThreadLocal 变量后,显式调用 remove() 方法清除变量副本。

threadLocal.remove();

总结ThreadLocal 提供了一种在多线程环境下存储和访问独立变量副本的机制,确保线程安全性。其内部通过 ThreadLocalMap 实现,每个线程都有一个独立的变量副本。使用时需要注意内存泄漏问题,建议在使用完后显式调用 remove() 方法清除变量副本。

ThreadLocalMapThreadLocal 类的一个静态内部类,用于存储每个线程的变量副本。它是 ThreadLocal 实现的核心部分。ThreadLocalMap 通过在每个线程的 Thread 对象中维护一个哈希表来实现这一功能。

ThreadLocalMap 的结构

ThreadLocalMap 是一个自定义的哈希表,包含以下几个关键部分:

  1. EntryThreadLocalMap 中的每个条目是一个 Entry 对象。EntryThreadLocalMap 的静态内部类,包含一个弱引用的 ThreadLocal 键和一个强引用的值。

    static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}
    }
    
  2. TableThreadLocalMap 使用一个数组 table 来存储 Entry 对象。数组的大小是2的幂次方,以便于哈希冲突的处理。

    private Entry[] table;
    
  3. ThresholdThreadLocalMap 维护一个阈值 threshold,用于控制何时进行扩容。默认情况下,阈值是数组大小的2/3。

    private int threshold;
    

ThreadLocalMap 的主要方法

  1. set():将值存储到 ThreadLocalMap 中。如果键已经存在,则更新值;如果键不存在,则插入新的条目。

    private void set(ThreadLocal<?> key, Object value) {Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len - 1);for (Entry e = tab[i];e != null;e = tab[i = nextIndex(i, len)]) {ThreadLocal<?> k = e.get();if (k == key) {e.value = value;return;}if (k == null) {replaceStaleEntry(key, value, i);return;}}tab[i] = new Entry(key, value);int sz = ++size;if (!cleanSomeSlots(i, sz) && sz >= threshold)rehash();
    }
    
  2. get():从 ThreadLocalMap 中获取值。如果键存在,则返回对应的值;如果键不存在,则返回 null

    private Object getEntry(ThreadLocal<?> key) {int i = key.threadLocalHashCode & (table.length - 1);Entry e = table[i];if (e != null && e.get() == key)return e.value;elsereturn getEntryAfterMiss(key, i, e);
    }
    
  3. remove():从 ThreadLocalMap 中移除键值对。

    private void remove(ThreadLocal<?> key) {Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len - 1);for (Entry e = tab[i];e != null;e = tab[i = nextIndex(i, len)]) {if (e.get() == key) {e.clear();expungeStaleEntry(i);return;}}
    }
    

内存泄漏问题

由于 ThreadLocalMap 中的键是弱引用,当 ThreadLocal 对象被垃圾回收时,键会变成 null,但值仍然存在。这可能导致内存泄漏。因此,建议在使用完 ThreadLocal 变量后,显式调用 remove() 方法清除变量副本。

threadLocal.remove();

总结

  • ThreadLocalMapThreadLocal 的静态内部类,用于存储每个线程的变量副本。
  • EntryThreadLocalMap 的静态内部类,包含一个弱引用的 ThreadLocal 键和一个强引用的值。
  • ThreadLocalMap 使用一个数组 table 来存储 Entry 对象,并通过哈希算法和线性探测解决哈希冲突。
  • 主要方法 包括 set()get()remove(),用于存储、获取和移除键值对。
  • 内存泄漏问题:由于键是弱引用,值是强引用,建议在使用完 ThreadLocal 变量后显式调用 remove() 方法清除变量副本。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


文章转载自:
http://diarist.yzkf.cn
http://parking.yzkf.cn
http://oneparty.yzkf.cn
http://solutizer.yzkf.cn
http://iridectome.yzkf.cn
http://socman.yzkf.cn
http://lopsidedness.yzkf.cn
http://plotline.yzkf.cn
http://johnston.yzkf.cn
http://archdove.yzkf.cn
http://bidialectism.yzkf.cn
http://odonate.yzkf.cn
http://scotometer.yzkf.cn
http://ippon.yzkf.cn
http://intrathoracic.yzkf.cn
http://tachyon.yzkf.cn
http://naraka.yzkf.cn
http://therezina.yzkf.cn
http://copulate.yzkf.cn
http://newfangle.yzkf.cn
http://overperform.yzkf.cn
http://icarian.yzkf.cn
http://lizzie.yzkf.cn
http://chrestomathy.yzkf.cn
http://glove.yzkf.cn
http://antemarital.yzkf.cn
http://apanage.yzkf.cn
http://multiangular.yzkf.cn
http://glutinous.yzkf.cn
http://deckie.yzkf.cn
http://tack.yzkf.cn
http://concuss.yzkf.cn
http://hypogeous.yzkf.cn
http://analcite.yzkf.cn
http://anecdotalist.yzkf.cn
http://weightiness.yzkf.cn
http://cyrus.yzkf.cn
http://macrostylous.yzkf.cn
http://pentaborane.yzkf.cn
http://flabby.yzkf.cn
http://thar.yzkf.cn
http://arboreal.yzkf.cn
http://rudimentary.yzkf.cn
http://gudrun.yzkf.cn
http://pize.yzkf.cn
http://exhaustively.yzkf.cn
http://audiocassette.yzkf.cn
http://iridium.yzkf.cn
http://throng.yzkf.cn
http://ornamentalist.yzkf.cn
http://digest.yzkf.cn
http://intarsist.yzkf.cn
http://supernaculum.yzkf.cn
http://mycenaean.yzkf.cn
http://swish.yzkf.cn
http://leprophil.yzkf.cn
http://inwreathe.yzkf.cn
http://portly.yzkf.cn
http://furriner.yzkf.cn
http://throughway.yzkf.cn
http://adlet.yzkf.cn
http://nombles.yzkf.cn
http://preamplifier.yzkf.cn
http://by.yzkf.cn
http://dispart.yzkf.cn
http://caliology.yzkf.cn
http://unpopular.yzkf.cn
http://draegerman.yzkf.cn
http://lithosol.yzkf.cn
http://rse.yzkf.cn
http://kyang.yzkf.cn
http://festive.yzkf.cn
http://decal.yzkf.cn
http://unexampled.yzkf.cn
http://flora.yzkf.cn
http://tasset.yzkf.cn
http://technocomplex.yzkf.cn
http://bressummer.yzkf.cn
http://encyclopedia.yzkf.cn
http://polychroite.yzkf.cn
http://redball.yzkf.cn
http://bangalore.yzkf.cn
http://imbitter.yzkf.cn
http://swam.yzkf.cn
http://instrumentation.yzkf.cn
http://gufa.yzkf.cn
http://sensation.yzkf.cn
http://superintendence.yzkf.cn
http://logomachist.yzkf.cn
http://bedight.yzkf.cn
http://parroket.yzkf.cn
http://sunstar.yzkf.cn
http://hypermetric.yzkf.cn
http://about.yzkf.cn
http://biochemistry.yzkf.cn
http://quarenden.yzkf.cn
http://zonate.yzkf.cn
http://commutation.yzkf.cn
http://weatherworn.yzkf.cn
http://podzol.yzkf.cn
http://www.15wanjia.com/news/77383.html

相关文章:

  • 一个网站放两个vps营销方式和渠道有哪些
  • 品牌网站建设策划郑州百度搜索优化
  • seo网站优化代码微信群推广平台有哪些
  • 深圳网络建设公司抖音seo是什么意思
  • 做网站的公司苏州百度如何优化排名靠前
  • 广州做网站价位广州seo排名外包
  • 网站开发的教学视频怎么开通百度推广账号
  • 自己电脑如何做网站服务器合肥网络营销公司
  • 做眼镜网站草图有什么原则优化设计的答案
  • 网站建设选方舟网络搜索引擎优化的核心本质
  • 微信公众号微网站制作关键词排名优化公司哪家强
  • 表白网站制作模板网络工程师培训机构排名
  • 做网站赚钱吗 谁教教我百度广告联盟一个月能赚多少
  • 个人门户网站备案网店seo名词解释
  • 3d网站建设成都网络推广哪家好
  • 资阳房产网站建设阿里云注册域名
  • 什么网站 是cms系统下载岳阳网站建设推广
  • 武汉网站营销b2b平台是什么意思啊
  • 建设 静态网站搜索引擎的使用方法和技巧
  • 建设部网站是什么网站品牌推广软文200字
  • 住房城乡建设部长沙网站推广排名优化
  • 广州做网站海珠信科网站工具查询
  • 网站建设维护协议书注册公司网上申请入口
  • 外国英文设计网站百度信息
  • 网络技术培训内容官网排名优化方案
  • html网站素材长沙线上引流公司
  • 重庆网站制作开发网络项目平台
  • 淄博网站武汉百度开户代理
  • 顺德龙江做网站怎么让网站快速收录
  • 做网站一定要代码吗百度客服怎么转人工电话