<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[今天的BUG保熟。]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/tujisitan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tujisitan]]></copyright><item><title><![CDATA[FreeSwitch v1.10.7从零安装部署]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/136742513</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/136742513</guid><author>tujisitan</author><pubDate>Fri, 15 Mar 2024 16:10:58 +0800</pubDate><description><![CDATA[编译：./configure --enable-pic --enable-shared --enable-libx264 --enable-gpl --extra-libs="-ldl" --extra-cflags=-I/usr/include --extra-ldflags=-L/usr/lib64。安装过程中腾讯云的仓库找不到speex-devel、speexdsp-devel，丢了个阿里云的repo到/etc/yum.repo/下面启用后继续安装。]]></description><category></category></item><item><title><![CDATA[docker和nvidia-docker离线安装（GPU）]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/136694360</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/136694360</guid><author>tujisitan</author><pubDate>Wed, 13 Mar 2024 23:16:06 +0800</pubDate><description><![CDATA[离线安装GPU Docker]]></description><category></category></item><item><title><![CDATA[Mac M1 Docker安装RabbitMQ镜像]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/136694026</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/136694026</guid><author>tujisitan</author><pubDate>Wed, 13 Mar 2024 22:59:05 +0800</pubDate><description><![CDATA[【代码】Mac M1 Docker安装RabbitMQ镜像。]]></description><category></category></item><item><title><![CDATA[Freeswitch总结大全]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106724815</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106724815</guid><author>tujisitan</author><pubDate>Fri, 12 Jun 2020 22:28:43 +0800</pubDate><description><![CDATA[版权声明：本文为优快云博主「Magician~」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.youkuaiyun.com/qq_16633405/article/details/87918031
文章目录
1、Freeswitch安装
参考：https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7
2、Freeswitch中文文档
参考（需翻墙）：http]]></description><category></category></item><item><title><![CDATA[JAVA并发二十九：一篇文章，让你彻底弄懂生产者–消费者问题]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106178041</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106178041</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:57:04 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18117.html
生产者-消费者模式是一个十分经典的多线程并发协作的模式，弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题，实际上主要是包含了两类线程，一种是生产者线程用于生产数据，另一种是消费者线程用于消费数据，为了解耦生产者和消费者的关系，通常会采用共享的数据区域，就像是一个仓库，生产者生产数据之后直接放置在共享数据区中，并不需要关心消费者的行为；而消费者只需要从共享数据区中去获取数据，就不再需要关心生产者的]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十八：大白话说java并发工具类-Semaphore，Exchanger]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177980</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177980</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:51:34 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18114.html
1. 控制资源并发访问–Semaphore
Semaphore可以理解为信号量，用于控制资源能够被并发访问的线程数量，以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证，线程需要先通过acquire方法获取该许可证，该线程才能继续往下执行，否则只能在该方法出阻塞等待。当执行完业务功能后，需要通过release()方法将许可证归还，以便其他线程能够获得许可证继续执行。
Semaphore可以用于做流量]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十七：大白话说java并发工具类-CountDownLatch，CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177902</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177902</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:47:49 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18110.html
1. 倒计时器CountDownLatch
在多线程协作完成业务功能时，有时候需要等待其他多个线程完成任务之后，主线程才能继续往下执行业务功能，在这种的业务场景下，通常可以使用Thread类的join方法，让主线程等待被join的线程执行完之后，主线程才能继续往下执行。当然，使用线程间消息通信机制也可以完成。其实，java并发工具类中为我们提供了类似“倒计时”这样的工具类，可以十分方便的完成所说的这种业务场景。
为了能够理]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十六：Java中atomic包下原子操作类总结]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177779</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177779</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:42:46 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18107.html
1. 原子操作类介绍
在并发编程中很容易出现并发安全的问题，有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作，就有可能获取不到正确的值，而这个问题，最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略，并不是特别高效的一种解决方案。实际上，在J.U.C下的atomic包提供了一系列的操作简单，性能高效，并能保证线程安全的类去更新基]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十五：带你认识FutureTask]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177717</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177717</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:36:35 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18102.html
1.FutureTask简介
在Executors框架体系中，FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口，FutureTask提供了启动和取消异步任务，查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果，但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束，任务不能重新启动或取消，除非调用runAndReset(]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十四：线程池之ScheduledThreadPoolExecutor]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177492</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177492</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:34:14 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18098.html
1. ScheduledThreadPoolExecutor简介
ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务，相对于任务调度的Timer来说，其功能更加强大，Timer只能使用一个后台线程执行任务，而ScheduledThreadPoolExecutor则可以通过构造函数来指定后台线程的个数。ScheduledThreadPoolExecutor类的UML图如下]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十三：线程池ThreadPoolExecutor实现原理]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177286</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177286</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:23:01 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18095.html
1. 为什么要使用线程池
线程池：一种线程使用模式。线程过多会带来调度开销，进而影响缓存局部性和整体性能。而线程池维护着多个线程，等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用，还能防止过分调度。
可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如，线程数一般取cpu数量+2比较合适，线程数过多会导致额外的线程]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十二：LinkedBlockingQueue实现原理]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177153</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177153</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:12:44 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18092.html
在上一篇文章中我们分析了ArrayBlockingQueue的实现原理，在这一篇文章中我们一起去寻踪LinkedBlockingQueue。
3. LinkedBlockingQueue实现原理
LinkedBlockingQueue是用链表实现的有界阻塞队列，当构造对象时为指定队列大小时，队列默认大小为Integer.MAX_VALUE。从它的构造方法可以看出：
public LinkedBlockingQueue() ]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十一：ArrayBlockingQueue实现原理]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106177081</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106177081</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:05:59 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18090.html
1. ArrayBlockingQueue简介
在多线程编程过程中，为了业务解耦和架构设计，经常会使用并发容器用于存储多线程间的共享数据，这样不仅可以保证线程安全，还可以简化各个线程操作。例如在“生产者-消费者”问题中，会使用阻塞队列（BlockingQueue）作为数据容器，关于BlockingQueue可以看该系列第十六篇文章。为了加深对阻塞队列的理解，唯一的方式是对其实验原理进行理解，这篇文章就主要来看看ArrayB]]></description><category></category></item><item><title><![CDATA[JAVA并发系列二十：并发容器之BlockingQueue]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106176964</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106176964</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 17:02:57 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18084.html
1. BlockingQueue简介
在实际编程中，会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类，但是这些容器类基本上不是线程安全的，除了使用Collections可以将其转换为线程安全的容器，Doug Lea大师为我们都准备了对应的线程安全的容器，如实现List接口的CopyOnWriteArrayList，实现Map接口的ConcurrentHashMap]]></description><category></category></item><item><title><![CDATA[JAVA并发系列十九：深入理解ThreadLocal（三）–详解ThreadLocal内存泄漏问题]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106176680</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106176680</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 16:57:28 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18072.html
1. 造成内存泄漏的原因？
threadLocal是为了解决对象不能被多线程共享访问的问题，通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中，这样每个线程使用自己的对象实例，彼此不会影响达到隔离的作用，从而就解决了对象在被共享访问带来线程安全问题。如果将同步机制和threadLocal做一个横向比较的话，同步机制就是通过控制线程访问共享对象的顺序，而threadLoc]]></description><category></category></item><item><title><![CDATA[JAVA并发系列十八：深入理解ThreadLocal（二）]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106176455</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106176455</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 16:45:42 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18065.html
接上一篇，继续深扒ThreadLocal中最重要的ThreadLocalMap知识点
3. ThreadLocalMap详解
从上面的分析我们已经知道，数据其实都放在了threadLocalMap中，threadLocal的get，set和remove方法实际上具体是通过threadLocalMap的getEntry,set和remove方法实现的。如果想真正全方位的弄懂threadLocal，势必得在对threadLoc]]></description><category></category></item><item><title><![CDATA[JAVA并发专题十七：深入理解ThreadLocal（一）]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106176290</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106176290</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 16:31:58 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/18063.html
1. ThreadLocal的简介
在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题，但是这种加锁的方式会让未获取到锁的线程进行阻塞等待，很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作，那么，如果每个线程都使用自己的“共享资源”，各自使用各自的，又互相不影响到彼此即让多个线程间达到隔离的状]]></description><category></category></item><item><title><![CDATA[JAVA并发十六：并发容器之ConcurrentLinkedQueue]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106175989</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106175989</guid><author>tujisitan</author><pubDate>Sun, 17 May 2020 16:26:30 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/6299.html
1.ConcurrentLinkedQueue简介
在单线程编程中我们会经常用到一些集合类，比如ArrayList,HashMap等，但是这些类都不是线程安全的类。在面试中也经常会有一些考点，比如ArrayList不是线程安全的，Vector是线程安全。而保障Vector线程安全的方式，是非常粗暴的在方法上用synchronized独占锁，将多线程执行变成串行化。
要想将ArrayList变成线程安全的也可以使用Collec]]></description><category></category></item><item><title><![CDATA[JAVA并发十五：并发容器之CopyOnWriteArrayList]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106167240</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106167240</guid><author>tujisitan</author><pubDate>Sat, 16 May 2020 23:15:15 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/6294.html
1.CopyOnWriteArrayList的简介
java学习者都清楚ArrayList并不是线程安全的，在读线程在读取ArrayList的时候如果有写线程在写数据的时候，基于fast-fail机制，会抛出ConcurrentModificationException异常，也就是说ArrayList并不是一个线程安全的容器。
当然您可以用Vector,或者使用Collections的静态方法将ArrayList包装成一个线]]></description><category></category></item><item><title><![CDATA[JAVA并发十四：并发容器之ConcurrentHashMap(JDK 1.8版本)]]></title><link>https://blog.youkuaiyun.com/tujisitan/article/details/106167012</link><guid>https://blog.youkuaiyun.com/tujisitan/article/details/106167012</guid><author>tujisitan</author><pubDate>Sat, 16 May 2020 23:11:00 +0800</pubDate><description><![CDATA[原博地址：https://www.javazhiyin.com/6288.html
1.ConcurrentHashmap简介
在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况，因为hashmap并不是线程安全的，通常我们可以使用在java体系中古老的hashtable类，该类基本上所有的方法都采用synchronized进行线程安全的控制。
可想而知，在高并发的情况下，每次只有一个线程能够获取对象监视器锁，这样的并发性能的确不令人满意。另外一种方式通过Collections的Maps]]></description><category></category></item></channel></rss>