
线程
一只小小狗
大家好我是练习时长2年半的程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
请你说说乐观锁和悲观锁,以及适用场景
每次都默认最好的情况,每次拿数据的时候都认为别人不会修改,所以上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。 乐观锁多用于读应用类型,提高吞吐量。总是假设最坏的情况,每次拿数据的时候都认为别人会修改,所有每次都要上锁,比如行锁、表锁、读锁、写锁都是在操作之前上锁。乐观锁:版本控制器SVN GIT等都是使用乐观锁。悲观锁:是需要排队等待的,悲观的好处是减少并发,也限制了吞吐量,当并发量大的时候由于锁消耗资源,锁定时间长会导致性能下降,资源内耗严重,所以原创 2022-06-08 19:48:19 · 195 阅读 · 0 评论 -
亿计数据唯一性多字段去重(Java具体操作)
亿计数据库唯一性多字段去重1.针对问题2.达到效果3.解决方案1.针对问题针对以下四个问题进行处理海量数据单独表多唯一性字段重复数据和垃圾数据多2.达到效果高效准确无线程安全问题3.解决方案如有错误欢迎指正...原创 2022-04-21 16:12:14 · 1598 阅读 · 0 评论 -
Synchronized代码块锁的是什么?全局锁?对象锁?
对象锁:锁的是这个对象。全局锁:锁的是那个写了synchronized关键字的方法或者代码块。这里主要去聊全局锁当java关键字 Synchronized()代码块锁随便的一个类比如,Integer.class时(或者一个静态变量(前提是不改变指向))比如下列代码package cn.com.demo.utils;import lombok.Getter;import java.util.stream.IntStream;/** * @author JMWANG */pu.原创 2022-02-25 16:50:43 · 1037 阅读 · 0 评论 -
非静态方法上加 Synchronized
Synchronzied 修饰非静态方法==》对象锁Synchronzied 修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了;什么时候选择在非静态方法上Synchronzied ?首先我们要知道,加载非静态方法上是对象锁,一个class类模板可以复制出无数的类,也就是说在非静态方法上加Synchronzied ,只能达到当前的这个类中的各种操作是线程安全的。多个线程同时操作一个对象为前提。以下列代码为例:@Slf4jpublic class TesThread { v原创 2022-02-24 13:59:16 · 477 阅读 · 0 评论 -
ThreadLocal 线程重用导致数据串行问题(查看访问的ip地址)
当使用ThreadLocal中来缓存当前线程信息的时候,由于不断创建销毁线程是一个很大的开销,我们会使用线程池来管理闲置的线程,线程池中的线程是固定的,多线程的状态下会将同一个线程不断的重用。这样我们用线程来缓存数据信息的时候。顾名思义,线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从ThreadLocal 获取的值是之前其他用户的请求遗留的值。这时,ThreadLocal 中的用户信息就是其他用户的信息。测试代码private final ThreadLocal<String>原创 2022-02-23 17:11:42 · 1069 阅读 · 0 评论 -
CopyOnWriteXXX(ArrayList等)适用场景-并发容器
顾名思义:写时复制。CopyOnWriteXXX是线程安全的集合,比如CopyOnWriteArrayList 就是去代替ArrayList很好的选择。但是CopyOnWriteXXX更多的时候特殊情况下的高级集合。为什么适用起来,效率低下?特殊情景,由于CopyOnWriteArrayList 是线程安全,在经常会大量写入的情况下我使用了CopyOnWriteArrayList ,但是在性能测试的时候发现此步骤的消耗远远超出了预期时间。在大量写入的时候,会进行大量的数据复制操作,也就是创建一个原创 2022-02-23 11:22:36 · 522 阅读 · 0 评论 -
ThreadFactoryBuilder JDK1.8删除了这个类
ThreadFactoryBuilder JDK1.8删除了这个类在JDK1.8中 并且使用maven会找不到这个类。pom需要导入坐标。 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>推荐一篇关原创 2021-03-20 17:56:53 · 1083 阅读 · 0 评论 -
手动创建线程池,效果会更好哦
手动创建线程池阿里巴巴手册中有一句话规避资源耗尽的风险,推荐写法: //获取系统处理器个数,作为线程池数量 int nThreads = Runtime.getRuntime().availableProcessors(); ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d").build()原创 2021-03-20 17:53:48 · 667 阅读 · 0 评论 -
谈一谈synchronized和lock的区别
synchronized和lock的区别1.作用的位置不同synchronized可以给方法,代码块加锁lock只能给代码块2.锁的获取机制和释放机制不同synchronized无需动手获取锁和释放锁,发生异常会自动解锁,不会出现死锁。locl需要自己加锁和释放锁,lock() 和 unlock() ,如果忘记就会出现死锁。一般我们在finally中 解锁。synchronized 修饰成员方法时,默认锁对象,就是当前对象synchronized 修饰静态方法时,默认的锁对象,当前类的cl原创 2020-11-13 15:04:22 · 164 阅读 · 0 评论 -
精简理解:并发与并行的区别
并发一个CPU执行多个任务,按照时间片来进行交替执行。并行(同时进行)多个CPU来处理多个任务。原创 2020-11-11 21:01:49 · 116 阅读 · 0 评论 -
谈谈我对ThreadLocal的理解
谈谈我对ThreadLocal的理解作用实现线程的上下文传递对象为每个线程创建一个副本例子1:证面ThreadLocal为每个线程创建一个副本public class ThreadLocalTest { private static ThreadLocal<Long> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { //开启多个线程 Task task原创 2020-11-10 20:06:37 · 139 阅读 · 0 评论 -
Sleep和Wait的区别?
Sleep和Wait的区别?1.所属的类不同sleep方法是定义在Thread上wait方法是定义在Object上2.对于锁资源的处理方式不同sleep 不会释放锁wait 会释放3.使用范围sleep可以使用在任何代码块中wait必须在同步方法中或同步代码块执行4.与wait配套用的方法void notify()唤醒等待的单个线程void notifyAll()唤醒所有等待的线程void wait()等待,直到被唤醒声明周期为什么wait定义在Object中,而不原创 2020-11-10 10:41:52 · 351 阅读 · 0 评论 -
我对线程安全的理解?
我对线程安全的理解?当多个线程访问一个对象时,如果不用进行额外的同步控制或者协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的。那么不安全的对象如何做到线程安全?使用synchronized(Object)关键字,控制代码块加锁,或者StringBuffer对象内部方法上锁。如果在开发中需要拼接字符串,使用StringBuilder还是StringBuffer?场景1:如果是多个线程访问同一个资源,就需要使用StringBuffer,或者StringBuilder原创 2020-11-06 15:43:29 · 132 阅读 · 0 评论 -
线程的生命周期以及动态
线程的生命周期NEW 创建RUNNABLE 就绪状态BLOCKED 阻塞,因为锁WAITING 无限等待TIMED WAITING 有限等待TERMINATED 结束原创 2020-11-06 15:24:21 · 145 阅读 · 0 评论 -
创建线程的本质
创建线程的本质一般我们去说创建线程有三种方法:1.继承Thread类2.实现Runnable接口3.实现Callable接口(可以获取线程执行之后的返回值)实际上线程的本质是继承Thread 类后面两种是创建了一个可执行的任务,要采用多线程的方式执行,并不是一个线程。还需要创建Thread对象执行,比如:new Thread(new Runnable(){}).start(); 但是在实际开发中我们通常选用线程池的方式来完成Thread的创建,并且更好的管理。Runnable vs c原创 2020-11-06 14:20:34 · 304 阅读 · 1 评论 -
JAVA中四种线程池
四种线程池newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPoolnewFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的原创 2020-11-05 15:05:49 · 367 阅读 · 0 评论 -
对Hashtable、HashMap、ConcurrentHashMap的理解
对Hashtable、HashMap、ConcurrentHashMap的理解Hashtable 是线程安全的对象,但是已经不使用了内部是一个数组,一层一层都会上锁,所以会阻塞。HashMap 线程不安全如果多个线程同时操作一个HashMap,会出现不安全的情况,甚至死锁。ConcurrentHashMap 兼顾两者性能和安全并发包下的ConcurrentHashMap分段锁每一段都可以同时 put get (先通过key 找到hash然后找到所在段,在找到段内位置)总结1.如果不是原创 2020-11-04 21:07:35 · 127 阅读 · 0 评论 -
对ArrayList和Vector的理解
ArrayList 和 VectorArrayList 线程不安全 效率高 常用 (需要自己加锁)Vector 线程安全的 效率低(内部加锁了,很少用和问)原创 2020-11-04 20:40:50 · 98 阅读 · 0 评论 -
对线程、进程、多线程的理解使用和产生死锁
线程、进程、多线程1.继承Thread类1.1 继承操作有3步2.Runnable接口2.1 继承操作有3步3.Callable接口(了解)初识并发问题流程图线程停止线程休眠sleep线程礼让 yield,礼让不一定成功线程强制执行 Join(插队)线程优先级守护线程(GC 日志 监控内存)daemon线程同步 synchronized同步方法同步块 synchronized(obj){}JUC安全类型集合产生死锁四个条件lock锁(可重复锁)生产者消费者问题管程法及时不创建线程,也会有main线程,GC原创 2020-11-02 17:20:40 · 317 阅读 · 0 评论