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

做快递单的网站会不会是骗人的网站功能有哪些

做快递单的网站会不会是骗人的,网站功能有哪些,桂建云平台注册,thinkphp 企业网站多线程编程中#xff0c;数据共享与隔离一直是开发者需要面对的挑战之一。而Java中的ThreadLocal提供了一种优雅的解决方案#xff0c;允许每个线程都拥有自己独立的数据副本#xff0c;从而避免了共享数据带来的线程安全问题。然而#xff0c;正如事物总有两面性一样… 多线程编程中数据共享与隔离一直是开发者需要面对的挑战之一。而Java中的ThreadLocal提供了一种优雅的解决方案允许每个线程都拥有自己独立的数据副本从而避免了共享数据带来的线程安全问题。然而正如事物总有两面性一样ThreadLocal也存在一些潜在的陷阱尤其是与内存泄漏相关的问题。 什么是ThreadLocal 在深入讨论ThreadLocal的内存泄漏问题之前我们先来了解一下ThreadLocal的基本概念。ThreadLocal是Java中的一个工具类提供了一种线程级别的数据隔离机制。通过ThreadLocal我们可以在每个线程中存储自己的数据副本互不影响从而简化了多线程编程中的共享数据问题。 public class MyThreadLocal {private static final ThreadLocalString threadLocal new ThreadLocal();public static void set(String value) {threadLocal.set(value);}public static String get() {return threadLocal.get();} }ThreadLocal应用场景 Web应用中的用户身份管理 在Web应用中用户的身份信息是经常需要被访问的数据。使用ThreadLocal可以轻松地在用户登录后将用户信息存储在ThreadLocal中这样在整个请求处理周期内都可以方便地获取到用户身份信息而无需将用户信息作为参数传递到每个方法中。 public class UserContext {private static final ThreadLocalUser userThreadLocal new ThreadLocal();public static void setUser(User user) {userThreadLocal.set(user);}public static User getUser() {return userThreadLocal.get();}public static void clear() {userThreadLocal.remove();} }在用户登录时可以通过UserContext.setUser(user) 将用户信息存储在ThreadLocal中。随后在整个请求处理过程中通过UserContext.getUser() 即可获取到用户信息而无需一直传递User对象。 每个线程需要存储独立的对象副本 在我之前分享过的案例中我使用了ThreadLocal来实现IP属地获取的功能由于IP属地查询类Searcher需要在不同的线程中创建独立的对象ThreadLocal提供了一种有效的解决方案。 原文链接 利用Spring Boot实现客户端IP地理位置获取 private static final Logger log LogManager.getLogger(IPUtils.class);private static final String DB_PATH /root/home_place/ip2region.xdb;private static final ThreadLocalSearcher searcherThreadLocal ThreadLocal.withInitial(() - {try {return Searcher.newWithFileOnly(DB_PATH);} catch (Exception e) {log.error(初始化 IP 归属地查询失败: {}, e.getMessage());return null;}});ThreadLocal内存泄漏的原因 ThreadLocal可能导致内存泄漏的主要原因在于ThreadLocal在线程结束后如果没有手动调用remove方法清理ThreadLocal中的数据这些数据将会一直存在于线程的ThreadLocalMap中而不会被垃圾回收。这是因为ThreadLocalMap中的Entry 键值对保留了对ThreadLocal实例的强引用而ThreadLocal实例又引用着对应的值。即使线程结束了ThreadLocalMap中的引用关系依然存在阻碍了相关对象的垃圾回收。 ThreadLocal源码说明内存泄漏的原因 /*** ThreadLocalMap is a customized hash map suitable only for* maintaining thread local values. No operations are exported* outside of the ThreadLocal class. The class is package private to* allow declaration of fields in class Thread. To help deal with* very large and long-lived usages, the hash table entries use* WeakReferences for keys. However, since reference queues are not* used, stale entries are guaranteed to be removed only when* the table starts running out of space.*/static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always a* ThreadLocal object). Note that null keys (i.e. entry.get()* null) mean that the key is no longer referenced, so the* entry can be expunged from table. Such entries are referred to* as stale entries in the code that follows.*/static class Entry extends WeakReferenceThreadLocal? {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal? k, Object v) {super(k);value v;}}/*** The initial capacity -- MUST be a power of two.*/private static final int INITIAL_CAPACITY 16;/** The entries in this hash map extend WeakReference, using its main ref field as the key (which is always a ThreadLocal object). Note that null keys (i.e. entry.get() null) mean that the key is no longer referenced, so the entry can be expunged from table. Such entries are referred to as “stale entries” in the code that follows. */ 此哈希映射中的条目扩展 WeakReference使用其主 ref 字段作为键始终是 ThreadLocal 对象。请注意空键即 entry.get null意味着不再引用该键因此可以从表中删除该条目。此类条目在下面的代码中称为“过时条目”。 内存泄漏的防范使用方式 为了避免ThreadLocal导致的内存泄漏问题开发者应该养成良好的使用习惯 及时调用remove方法 在使用ThreadLocal的过程中务必在合适的时机调用remove方法手动清理ThreadLocalMap中的Entry。这样可以防止ThreadLocal对象和值的强引用一直存在有助于相关对象的垃圾回收。 public class MyThreadLocal {private static final ThreadLocalString threadLocal new ThreadLocal();public static void set(String value) {threadLocal.set(value);}public static String get() {return threadLocal.get();}public static void clear() {threadLocal.remove();} }使用try-finally块确保清理 在某些情况下使用try-finally块可以确保在发生异常时也能够调用remove方法避免遗漏清理的情况。在使用线程池等场景时特别注意ThreadLocal的生命周期避免长时间存在的线程携带着无用的ThreadLocal数据。 public class MyThreadLocal {private static final ThreadLocalString threadLocal new ThreadLocal();public static void set(String value) {threadLocal.set(value);}public static String get() {return threadLocal.get();}public static void main(String[] args) {try {set(value);// 在使用完之后立即调用remove方法} finally {clear();}} }小心线程池中的使用 在使用线程池等场景时特别要注意ThreadLocal的生命周期。线程池中的线程可能会被重用如果不及时清理ThreadLocal前一个任务中的ThreadLocal数据就会泄漏到下一个任务中。 4. 总结 ThreadLocal是一个强大的工具能够在多线程环境中解决共享数据的问题。然而开发者在使用ThreadLocal时应当小心特别是在长时间存在的线程和线程池等场景下要注意及时清理ThreadLocal以避免内存泄漏的发生。通过正确的使用习惯和最佳实践可以更好地发挥ThreadLocal的优势确保多线程环境下的数据安全和性能。 后续内容文章持续更新中… 近期发布。 关于我 你好我是Debug.c。微信公众号种棵代码技术树 的维护者一个跨专业自学Java对技术保持热爱的bug猿同样也是在某二线城市打拼四年余的Java Coder。 在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。 如果您对我感兴趣请联系我。 若有收获就点个赞吧喜欢原图请私信我。
http://wiki.neutronadmin.com/news/289117/

相关文章:

  • 龙岗做棋牌网站建设大兴网站定制开发
  • 苏州网站建设专家免费网站容量大
  • 深圳网站优化推广方案网页设计师岗位
  • 模板网站建设教程ip动态地址做网站
  • 常德天鹰建设有限公司网站网站建设服务哪家有
  • 网站排名快速提升工具如何创建一个网站用来存放东西
  • 网站友情链接购买自己做影视网站
  • 做宠物店网站的素材wordpress中英文模板
  • 义乌企业网站搭建首选wordpress主题momo
  • 建设银行开通网银网站上海网站建设网站开发
  • 响应式网站用什么工具电暖怎么做网站
  • 做网站租服务器wordpress过滤用户输入数据库
  • php靓号网站源码google adwords关键词工具
  • 阿里云做网站步骤网站开发工程师中级高级
  • 成华区门户网站网站设计方案怎么写
  • 专业企业网站建设郴州做网站的
  • 中信建设官方网站软件下载wordpress在线安装
  • 网站建设电子苏州建设银行官方网站
  • 网站怎么做浏览量才会多网站设计配色方案
  • 网易 自助网站建设个人养老保险缴费档次
  • 杭州营销型网站建设优秀网文
  • 济南装修公司排名前十强智能网站排名优化
  • 韶关市建设工程造价网站给帅哥做奴视频网站
  • 抢购网站源码李江seo
  • 宁波网站推广业务网站建设地图素材
  • 怎样做网站公司免费windows云电脑
  • 计算机科学与技术 开题报告 网站建设平面设计哪里学
  • 傻瓜式做网站程序网站推广话术与技巧
  • 哪里网站可以做微信头像制作手机网站用什么软件
  • 景安企业网站建设给客户做非法网站