常见线程安全类 String Integer StringBuffer Random Vector Hashtable java.util.concurrent包下的类 这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。也可以理解为 Hashtabletable=newHashtable(); newThread(()->{ table.put("key","value1"); }).start(); newThread(()->{ table.put("key","value2"); }).start(); 它们的每个方法是原子的 但注意...

缘由 今天早上看b站,突然间看到了这部电影,我以为这部电影是很早之前的了,直接在支付宝上搜了一下,没想到才刚刚上映。一看到这个电影的名字,我就被吸引住了,特别是“再见”这两个字,很有分量。毫不犹豫,货比三家,直接找了离家最近的店,这部电影好像并没有那么火,电影院安排的场次不多,而且影厅的位置不多,这对我来说刚刚好。 出发 我订的是下午2:10分的票,我1:50才从家里出发,在路上走的很快,那个商场我去过,十字路口拐弯,一直往前走就到啦!没想到到那边才2:05,嘻嘻,没有迟到。 挑座位 到那边的时候,人已经很多了,前面两排没有人。我的位置是7排4座,那一排看着就最右面空着几个位置。我知道,我的...

买票练习 @Slf4j(topic="c.ExerciseSell") publicclassExerciseSell{ publicstaticvoidmain(String[]args)throwsInterruptedException{ //模拟多人买票 TicketWindowwindow=newTicketWindow(1000); //所有线程的集合 List<Thread>threadList=newArrayList<>(); //卖出的票数统计 List<Integer>amountList=newVector<>(); ...

Java对象头 以32位虚拟机为例 普通对象 |--------------------------------------------------------------| |ObjectHeader(64bits)| |------------------------------------|-------------------------| |MarkWord(32bits)|KlassWord(32bits)| |------------------------------------|-------------------------| 数组对象 |-------------...

你可以做这样的类比: synchronized(对象)中的对象,可以想象为一个房间(room),有唯一入口(门)房间只能一次进入一人进行计算,线程t1,t2想象成两个人 当线程t1执行到synchronized(room)时就好比t1进入了这个房间,并锁住了门拿走了钥匙,在门内执行count代码 这时候如果t2也运行到了synchronized(room)时,它发现门被锁住了,只能在门外等待,发生了上下文切换,阻塞住了 这中间即使t1的cpu时间片不幸用完,被踢出了门外(不要错误理解为锁住了对象就能一直执行下去哦),这时门还是锁住的,t1仍拿着钥匙,t2线程还在阻塞状态进不来,只有下次轮到...

需求: 现在我有一个用户集合,集合中的各个用户的电话号码可能会重复,电话号码重复的用户只需要保留一个即可。 用户实体: packagecom.javabasic.javabasic.workidea; importlombok.Data; importlombok.EqualsAndHashCode; importlombok.experimental.Accessors; importjava.io.Serializable; importjava.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper=false) @Acce...

不推荐的方法 这些方法已过时,容易破坏同步代码块,造成线程死锁 主线程与守护线程 默认情况下,Java进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。 例: log.debug("开始运行..."); Threadt1=newThread(()->{ log.debug("开始运行..."); sleep(2); log.debug("运行结束..."); },"daemon"); //设置该线程为守护线程 t1.setDaemon(true); t1.start(); sleep(1)...

为什么需要join 下面的代码执行,打印r是什么? staticintr=0; publicstaticvoidmain(String[]args)throwsInterruptedException{ test1(); } privatestaticvoidtest1()throwsInterruptedException{ log.debug("开始"); Threadt1=newThread(()->{ log.debug("开始"); sleep(1); log.debug("结束"); r=10; }); t1.start(); log.debug("结果为:{}",r); ...

目录 为什么使用统一异常处理? 定义通用结果返回类 定义错误码 定义返回工具类 自定义异常类(可根据业务需求进行扩展) 全局异常处理类 验证全局异常处理器 为什么使用统一异常处理? 1.软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的try{…}catch{…}finally{…}代码块,不仅有大量的冗余代码,而且还影响代码的可读性。 2.使用统一结果处理时,有些异常我们可以提前预知并处理,但是一个运行时异常,我们不一定能预知并处理,这时可以使用统一异常处理,当异常发生时,触发该处理操作,从而保证程序的...

java对象POJO和JavaBean的区别  "PlainOrdinaryJavaObject",简单普通的java对象。主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象。 POJO的内在含义是指那些:有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。 publicclassBasicInfoVo{ privateStringorderId; privateIntegeruid; publicStringgetOrderId(){...

目录 异常的层次结构 Throwable Error(错误) Exception(异常) 可查的异常(checkedexceptions)和不可查的异常(uncheckedexceptions) 异常关键字 异常的申明(throws) 异常的抛出(throw) 异常的自定义 异常的捕获 异常基础总结 常用的异常 参考文章 异常的层次结构 异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的...

目录 字符串比较 equals compareTo和compareToIgnoreCase contentEquals  字符串切割 substring split 字符串转字节数组 getBytes  大小写转换 toLowerCase大写转小写 toUpperCase小写转大写 字符串的替换 replace:替换指定字符 replaceAll:替换所有正则表达式匹配到的字符串 replaceFirst:替换到最先匹配到的元素  获取指定字符下标 indexOf,lastIndexOf(获取最后出现的下标) 某个字符串中是否存在指定字符 contains() ...

sleep 1.调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞) 2.其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException 3.睡眠结束后的线程未必会立刻得到执行 4.建议用TimeUnit的sleep代替Thread的sleep来获得更好的可读性 sleep应用:限制对CPU的使用 在没有利用cpu来计算时,不要让while(true)空转浪费cpu,这时可以使用yield或sleep来让出cpu的使用权给其他程序 sleep实现 while(true){ try{ Thread.sle...

一、查看已知端口占用情况 比如,我们想知道8080端口的使用情况,或者说被谁占用了,命令如下: netstat-anp|grep8080 结果如下: 也可以使用命令: netstat-tln|grep8080  结果: 和上个命令对比,少了“2597932/java”,这个显示的是进程号以及被哪个程序所占用。 如果没有被占用,就什么都不显示。 二、查看全部端口占用情况 netstat-anp 或者 netstat-tln 显示结果分别如下面: [root@Cent0S8-FTPsysconfig]netstat-anpActiveInternetconnec...

项目场景: 今天在项目中向利用hashset给自定义实体类进行去重,但是去重未成功,项目中加的@Data注解现在依然未解决,看网上文章有感,so写下了此文章,文章有不足之处,希望各位大佬指正 问题描述  伪代码 / 自定义实体类 @Description: @DateCreatedin2022-10-11-20:05 @ModifiedBy: / publicclassStu{ privateStringname; privateIntegerage; publicStu(Stringname,Integerage){ this.name=name; this.age=age...

目录 封装: 继承: 多态: 封装: 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。 个人理解:将类中的某些字段设置为private,按照需求,提供getter/setter方法,隐藏内部实现。 优点: 1:减少耦合:可以独立的开发、测试、优化、使用和修改 2:减轻维护的负担:可以容易被程序员理解,并在调试过程中不影响其他模块 3:有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能 4:提...

1.为什么计算机内部采用二进制表示信息? 答:主要有3个方面的原因 (1)二进制系统只有两个基本符号:0和1所以,它的基本符号少,易于用稳态电路实现。 (2)二进制的编码、记数、运算等规则简单。 (3)二进制中的0和1与逻辑命题的“真”和“假”的对应关系简单,为计算机中实现逻辑运算和程序中的逻辑判断提供了便利的条件,特别是能通过逻辑门电路方便地实现算术运算。 2.既然计算机内部的所有信息都是用的二进制表示,为什么还要用到十六进制或八进制数? 答:计算机内部在进行信息的存储、传送和运算时,都是以工进制形式来表示信息的但在屏幕上或书本上书写信息时,由于二进制信息位数多,阅读、记忆不方便,而十六进...

栈与栈帧 JavaVirtualMachineStacks(Java虚拟机栈) 我们都知道JVM中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 栈中存储的是方法的参数和局部变量,方法执行完后,就会销毁 各个线程之间,栈帧之间是独立的,是线程私有的 线程上下文切换(ThreadContextSwitch) 因为以下一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码 线程的cpu时间片...

应用之异步调用 以调用方角度来讲,如果 需要等待结果返回,才能继续运行就是同步 不需要等待结果返回,就能继续运行就是异步 1)设计 多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了5秒钟,如果没有线程调度机制,这5秒cpu什么都做不了,其它代码都得暂停... 2)结论 比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程处理视频转换,避免阻塞主线程 tomcat的异步servlet也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞tomcat的工作线程 ui程序中,开线程进行其他操作,避免阻塞ui线程 应用之提高效率 充分利用...

单核 单核cpu下,线程实际还是串行执行的。操作系统中有一个组件叫做任务调度器,将cpu的时间片(windows下时间片最小约为15毫秒)分给不同的程序使用,只是由于cpu在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。总结为一句话就是:微观串行,宏观并行。 一般会将这种线程轮流使用CPU的做法称为并发,concurrent 时间片 时间片:CPU的时间片(TimeSlice)是操作系统中进行多任务处理的一种调度算法。在多任务处理环境下,当有多个进程需要共享CPU资源时,操作系统会将CPU的运行时间划分为若干个时间片段,每个时间片段被分配给一个进程使用。 时间片的长度是一个固定的时间...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~