中都

风习袅袅,盈水展千华,飞檐亭角清铃响。犹记当初,你回眸莞尔,一笑倾城百日香。

博客园 首页 新随笔 联系 订阅 管理

2021年3月31日 #

摘要: 一、去重 去重:用布隆过滤器,就是一个bitmap,但是有k个哈希函数,仅当一个数据的k个哈希函数找出的位置全部为1时,才表示这个数据在集合中,但是它也有一定的误判率,会把不存在的判断为存在,宁可错杀1000,不肯放过一个的这种,因此他不适合作0误判的场合,并且删除也不方便,你还不如重建一个布隆过滤 阅读全文
posted @ 2021-03-31 23:14 中都 阅读(1785) 评论(0) 推荐(0)

摘要: 一、线程调度算法 1、抢占式调度: 抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。 2、协同式调度: 阅读全文
posted @ 2021-03-31 23:00 中都 阅读(485) 评论(0) 推荐(0)

摘要: AbstractQueuedSynchronizer 类如其名,抽象的队列式的同步器,AQS 定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。 它维护了一个 volatile int state 阅读全文
posted @ 2021-03-31 22:57 中都 阅读(78) 评论(0) 推荐(0)

摘要: 1、减小锁粒度 减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)类的实现。对于 HashMap 而言,最重要的两个方法是 get 与 se 阅读全文
posted @ 2021-03-31 22:54 中都 阅读(577) 评论(0) 推荐(0)

摘要: 1、如何在两个线程之间共享数据 Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到“同步”和“互斥”。有以下常规实现方法: ⅰ 将数据抽象成 阅读全文
posted @ 2021-03-31 22:50 中都 阅读(231) 评论(0) 推荐(0)

摘要: Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile 变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取 volatile 类型的变量时总会返回最新写入的值。 1、变量可见性 其一 阅读全文
posted @ 2021-03-31 22:46 中都 阅读(402) 评论(0) 推荐(0)

摘要: 1、CountDownLatch(线程计数器 ) CountDownLatch类位于java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务 A,它要等待其他 4 个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch来实现这种功能了。 pub 阅读全文
posted @ 2021-03-31 22:43 中都 阅读(277) 评论(0) 推荐(0)

摘要: 阻塞队列,关键字是阻塞,先理解阻塞的含义,在阻塞队列中,线程阻塞有这样的两种情况: 当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。 当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。 阻塞队列的主要方法 阅读全文
posted @ 2021-03-31 22:40 中都 阅读(721) 评论(0) 推荐(0)

摘要: Java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是 ExecutorService。 一、线程池的作用 优点: 避免大量线程之间相互的抢占资源导致的阻塞现象; 减少线程的创建和销毁带来的开销提升性能; 阅读全文
posted @ 2021-03-31 22:35 中都 阅读(71) 评论(0) 推荐(0)

摘要: 一、CAS( 比较并交换-乐观锁机制-锁自旋 ) 1、概念及特性 CAS(Compare And Swap/Set)比较并交换,CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N)。V 表示要更新的变量(内存值),E 表示预期值(旧的),N 表示新值。当且仅当 V 值等 于 E 值时,才 阅读全文
posted @ 2021-03-31 22:30 中都 阅读(117) 评论(0) 推荐(0)

摘要: 一、同步锁与死锁 1、同步锁 当多个线程同时访问同一个数据时,很容易出现问题。为了避免这种情况出现,我们要保证线程同步互斥,就是指并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。 Java 中可以使用 synchronized 关键字来取得一个对象的同步锁。 阅读全文
posted @ 2021-03-31 22:13 中都 阅读(210) 评论(0) 推荐(0)

摘要: 巧妙地利用了时间片轮转的方式, CPU 给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务,任务的状态保存及再加载, 这段过程就叫做上下文切换。时间片轮转的方式使多个任务在同一颗 CPU 上执行变成了可能。 阅读全文
posted @ 2021-03-31 22:07 中都 阅读(632) 评论(0) 推荐(0)

摘要: 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。 阅读全文
posted @ 2021-03-31 22:04 中都 阅读(77) 评论(0) 推荐(0)

摘要: 一、线程的生命周期 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU 独自运行,所以 CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换; 阅读全文
posted @ 2021-03-31 21:59 中都 阅读(317) 评论(0) 推荐(0)

摘要: 一、继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。 阅读全文
posted @ 2021-03-31 21:53 中都 阅读(93) 评论(0) 推荐(0)

Live2D