自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 性能 和 扩张性 - 性能

资源:CPU cycles, memory, network bandwidth, I/O bandwidth, database requests, disk space。好的多线程,会让系统更快,吞吐更多;反之,则不然。资源需要高利用率;或者让更多的资源参加计算。cpu需要高负荷运算,不然加cpu也没用。...

2021-06-29 17:55:34 81

原创 性能 和 扩张性

多线程可以提高处理器的利用率;可以在一个任务正在执行的时候,发起另一个任务,从而更快速返回 提高响应。增加性能会带来高复杂性,所以除非需要,不追求高性能。

2021-06-29 17:27:06 82

原创 不要死掉 - 避免死锁 - 超时锁

用 Lock 类的 tryLock 设置超时锁。超过时间就报错。当 tryLock 报错了,记录信息,准备重新发起任务。用这个超时锁,在任务获取多个锁的时候,可以不必考虑获取锁的顺序,但要做好重新发起任务的准备。...

2021-06-29 16:48:05 302

原创 不要死掉 - 避免死锁

尽量只用一个锁。如果用到多个锁,文档记录获取顺序。看有没有死锁,首先找同时请求多个锁的方法,看这些被请求锁的获取顺序是否一致。尽量用 open calls,这样定位多个锁的使用和使用顺序就简单很多。...

2021-06-29 15:11:11 62

原创 不要死掉 - 死锁 - open calls

Taxi 和 dispatcher 构成了死锁。去访问带锁的方法,有风险:open calls 意思是被访问的方法 没带锁。我们应该尽量使用 open calls,这样,我们比较好判断锁的顺序是否一致。缩小 synchronized block 有时候会避免死锁:调用外部包含锁的方法,不利于诊断死锁。...

2021-06-29 14:11:58 142

原创 不要死掉 - 死锁 - 由协作对象之间产生的死锁

例子:

2021-06-29 10:58:43 68

原创 不要死掉 - 死锁 - 动态锁顺序的死锁

如图,从一个账户转钱到另一个账户:如果两个线程,一个是x转y,另一个是y转x,死锁就会发生。这种情况,关键还是固定获取锁的顺序。使用System.identityHashCode 获取对象的 hsahcode,从而来确认锁的顺序。如果两个对象的hashcode一样,则使用一个公共锁:当然,如果有现成的,比如账户编号,就用不着hashcode,会更简单。我们尽量短的时间来获取锁,但是这样的话,不容易测出来:...

2021-06-29 09:56:19 97

原创 不要死掉 - 死锁 - 关于顺序的死锁

两个锁,一人那一个,想要对方手上的那一个,还都不放:两个线程如果以同样的顺序去要这两个锁,就不会有问题。理这个顺序比较难

2021-06-28 17:43:34 48

原创 多线程 不要死掉

滥用锁,可能造成 锁次序相关的死锁问题。线程池可能有 资源相关的死锁问题。这章讨论死掉的原因和怎样避免它。

2021-06-28 16:31:13 61

原创 executor 总结

线程的创建和消亡:corePoolSize, maPoolSize 和 keepAliveTime处理排队的 Task:放队列里超过队列长度的任务:抛弃或者让调用者执行hooks用来扩展ThreadPoolServicediscardOldest和 PriorityBlockingQueue连用可能把高优先级的丢掉有些任务,他们之间可能有线程安全问题,所以要用SingleThreadPoolService...

2021-06-28 16:20:48 52

原创 并发一个递归算法

生成页面那个例子,最后以并发的形式下载图片,提高了效率。迭代通常可以换成并发,只要任务是独立的,计算量大,以及存在阻塞。只要任务是独立的,就可以并发:如果要等他们执行完,调用ExecutorService.invokeAll。迭代的任务要足够大,才有必要改成并发,因为并发有开销。如果情况允许,递归也可以改成并发:caller 可以使用shutdown 和 awaitTermination 来等待计算完成:...

2021-06-28 15:25:56 225

原创 一个扩展 ThreadPoolExecutor的例子

记录了总时间和任务总数:

2021-06-28 14:59:30 51

原创 可以在 executor 被创建好以后,改变它的参数

Executor 建立好了以后,各种参数也可以修改的:有那种不能在创建后,重新设置参数的pool,如 unconfigurableExecutorService,newSingleThreadExecutor。如果你不想让pool的参数被改变,用unconfigurableExecutorService。...

2021-06-28 13:57:27 103

原创 Java Executor 中的线程工厂

Thread factory线程工厂接口:建立定制化的 线程工厂,来设置 UncaughtExceptionHandler 。定制化的线程工厂,加了个名字,方便debug:用定制化的线程工厂,给线程加日志,统计和UncaughtExceptionHandler:...

2021-06-28 11:36:30 333

原创 java executor 队列满后,任务的处理策略

如果队列满了,就需要 staturation policies 来处理装不下的 task。或者Executor已关闭,处理那些还没有执行的任务。 有各种策略:AbortPolicy, CallerRunsPolicy, DiscardPolicy, and DiscardOldestPolicy.默认是abort policy,抛弃任务,并且抛出异常(abort ExecutionException)。discard policy是直接丢弃,不抛异常。caller run policy 就是...

2021-06-28 11:15:06 567

原创 扩展 ThreadpoolExecutor

用有长度限制的队列,可以避免 outOfMemoryError。有种同步队列(SynchronousQueue),它会立刻把task 交给线程,如果没有线程来处理这个任务,同步队列会拒绝这个 Task。有那种先进先出(FIFO)的队列(ArrayBlockingQueue 和 LinkedBlockingQueue),也有按优先级来的队列。(priorityBlockingQueue)一般用 newCachedThreadPool, 它的性能不错。也可以选择有线程数限制的pool,可以保证稳定性

2021-06-28 10:25:28 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除