首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

Java并发编程基础-ThreadLocal的使用

章节目录 ThreadLocal 简介 ThreadLocal 使用 1.ThreadLocal 简介 什么是ThreadLocal ThreadLocal 为线程变量,是一个以ThreadLocal对象为key,任意对象为值的存储 结构,这个结构被附带到线程上。 ThreadLocal的作用 通过set(T)来设置一个值,在当前线程下通过get()方法获取到原先设置的值。 2.ThreadLocal 使用 题目:设计一个方案统计每个接口的响应时间 思路: 采用AOP(面向切面编程),可以在方法调用前的切入点执行begin()方法,在方法调用后的切入点执行end()方法。 每个请求本质上是线程执行的过程,那么问题就变为统计每个线程执行过程的耗时。 采用工具类+实力方式会产生过多工具类对象 采用静态方法方式,如果不同步共享变量会产生并发获取系统时间的问题,统计不准确。 采用同步方式统计接口响应时间,接口性能会下降。 那么有没有一种方式是将不通接口响应时间值绑定到 不同线程上的方式,并且获取方法一致,但是时间值是每个线程特定可见的,答案就是使用ThreadLocal Profiler begin() 获取接口执行时间点、end()获取从begin()方法调用开始到end()方法被调用时的时间差,单位毫秒。 package org.seckill.Thread; public class Profiler { private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){ //第一次get()方法调用时会进行初始化,这个是在set()方法没有被调用的情况下发生,每个线程调用一次 protected Long initialValue() { return System.currentTimeMillis(); } }; //设置初始运行时刻 public static final void begin(){ TIME_THREADLOCAL.set(System.currentTimeMillis()); } public static final long end(){ return System.currentTimeMillis()- TIME_THREADLOCAL.get(); } public static void main(String[] args) { Profiler.begin(); Interrupted.SleepUnit.second(1); System.out.println("cost time "+Profiler.end()); } } 运行结果: 运行结果

优秀的个人博客,低调大师

Java中的‘锁’- synchronized、ReentrantLock、ReentrantReadWriteLock

1、隐式锁 对称线程同步 synchronized 用法:1、在方法声明时使用;2、修饰代码块中使用 隐式规则 1、当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行 2、当一个线程访问object的一个synchronized(this)同步代码块时,其他的线程可以访问该object中的非synchronized(this)同步代码块 3、synchronized(this)设置的对象锁中,当一个线程访问获取到锁,其他线程对object中相同对象锁的代码块都无法访问 性能和执行效率: 同步方法体<同步代码块 <synchronized(this)<同步代码块(byte锁) 如图1-2 图1-2 关于效率高低的判断,其实记住一点,锁时一个对象,加锁和释放锁都需要资源,对象越小效率越高 2、显式锁Lock和ReentrantLock Lock只是一个接口,它规定了锁的基础操作规范 如图2-1所示 图2-1 1、Lock()方法,线程获取锁,如果锁不可用,则禁用当前线程,在获得锁之前,该线程一直处于休眠 2、unlock()方法,释放锁,一般情况下,每个获取的锁都要对应一个释放锁 其他的方法像是lockInterruptibly、tryLock、tryLock(long time, TimeUnit unit)这几个方法无非就是在获取锁的过程中判断了一些条件,这里需要注意的是,方法中的锁一定要是共有的,如果是独立的锁,那么起不到相应的作用 3、显示锁,读写锁ReadWriteLock和ReentrantReadWriteLock ReadWriteLock是一个接口,只有两个方法,readLock()和writeLock(),此处注意,ReadWriteLock并不是Lock的子接口,但是ReadWriteLock中的读写锁都是依靠Lock来进行实现的 读写锁的机制: 1、读读不互斥:多线程读,并发不堵塞 2、读写互斥:有线程在写,那么所有的读线程就会堵塞,反过来,有读的线程在使用,写线程就会堵塞 3、写写互斥:写线程都是互斥的,两个线程去写,谁先拿到锁,就先写 图3-1 图3-1中是同时使用读写锁的时候的业务场景,比较经典的缓存场景 图3-2 图3-3 图3-2和图3-3则是模拟高并发的情况下的读写锁单独使用的情况下,图3-2的是模拟高并发的单元测试代码,图3-3是读写锁的代码 读写锁和普通锁的区别, 1、相同点:其实都是一种显式锁,手动加锁和解锁,都比较适合高并发场景 2、不同点:ReentrantReadWriteLock是对ReentrantLock的一种扩展,ReentrantReadWriteLock适合更加复杂的业务场景,可以实现一个方法的读写分离

优秀的个人博客,低调大师

JAVA实现九九乘法口诀

package test; /*获取1~10的和,并直接打印 思路: 两数之和加下一个数以此类推。 步骤: 1.创建for循环,定义初始化和为0。 2.让和加下一个数等于下一个和。 */ public class test1{ public static void main(String[] args) { //九九乘法口诀 System.out.println("九九乘法表"); System.out.println("-----------------------------------------------------------------------"); for(int z = 1;z<=9;z++) { for(int y = 1;y<=z;y++) { System.out.print(z+"*"+y+"="+z*y+"\t"); } System.out.println(); } System.out.println("-----------------------------------------------------------------------"); } }

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册