`
bruce008
  • 浏览: 172195 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最近重新读java concurrency in practice 随笔

阅读更多

觉得自己在并发编程还缺很多, 最近一段时间都在积极的学习中。 呵呵, 学到老, 活到老。 

Java 的并发编程涉及的方面还是非常多的:

1,  基础方面的: 对象的共享。 依照从安全性从高到低的方式 可以有

 

  •      最安全的对象共享就是不享, 一个对象仅仅局限在一个线程中。 如果一个对象只能被某个线程的局部变量 也就是在 栈(stack) 访问。
  •      ThreadLocal 也是一种非常安全的方式
  •      不可变对象  也就是对象的所有域都是final , 并且对象在建构函数中并没有this 指针的逃逸问题。
  •       普通对象    所有在线程之间并发 read/write 的方法都通过锁 来保护。

 

    接下来是并发编程会用到得一些常用的并发容器, 队列, 同步工具什么的

 

  •         并发容器   ConcurrentHashMap,  CopyOnWriteArrayList
  •         并发编程中最常用的生产者/ 消费者模式中常用的 ConcurrentLinkedQueue,  LinkedBlockingDeque。 如果要Queue 的队列大小有限的话都会涉及到 blocking 的问题。 在队列已满的情况下 再朝queue 里面插入元素会让当前线程 wait。
  •        常用的同步工具  各种 Latch,  Semaphore, Barrier。 CountDownLatch 是最常用的一种Latch, 设置一个初始值。需要等待的线程调用 await 方法, 其它线程可以 调用 countDown 来递减这个计数器。 当counter 到 0了, 所有等待这个Latch的线程都会被唤醒。  

2, 并发程序的结构

      2.1,  Callable/  Future

             Runnable 的局限是没有返回值,

 

                interface Callable<R> {
			R call() throws Exception
		}

             不光是有了返回值, 还有 Exception。 

 

            Future 表示了一个异步调用的结果

 

      public interface Future<V> {

    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

 

            这个接口的实现通常是  get 方法只有在 isDone 的时候才马上返回, 否则它会等待。 但是有了这个Future 可以将运行线程的Callable 结果安全的传递给另外一个线程。  

 

      2.2,  Execotor  执行框架

在JDK的  java.utility.concurrency (JUC) 包中 定义了 Execotor  这个仅仅有一个execute 方法, 另外ExecutorService 接口扩展了它。 不仅提供了管理life cycle 的方法外, 还包括了 submit  Runnable, submit  Callable 的方法。  另外 invokeAll,  timeout 版的invokeAll 也是非常有用的。  

 

 

      2.3,  取消, 中断 , stop

                service,生命周期的安全性也是非常重要的。 

 

      2.4, 线程池

               ThreadPoolExecutor

              JUC 的Executors 工厂类提供了几个非常有用的ExecutorService

                       newFixedThreadPool  固定线程数目的线程池

                       newSingleThreadExecutor 创建单线程的Executor  一个线程来run 所有的task , 这样不会有撒并发的问题

                       newScheduledThreadPool   可以 schedule commands。有了这个Service 可以忘掉以前的Timer 了。

 

 

3,  高级主题

       1,  减少锁的竞争

              一些常用的手段无非是尽量少用 锁,  降低锁的粒度,  降低锁的访问。 

 

       2,  instrinsic 锁 与 ReentrantLock 的比较

                  instrinsic logic  也就是 synchronized 的关键字的运用 主要借助java 中 任何一个Object 都有一个wait 队列。   这个synchronized 用的时候 锁的获取与释放必须在同一个block 或者方法中。 

                 ReentrantLock 就比较自由, 但是比较担心没有 unlock, 因此永远不要忘了 try/finally 的方式来用它。

                 ReentrantLock 可以做到 tryLock,  甚至可以用 timeout 方式在限定时间来获取锁。  

         ReentrantLock  可以选择 fair /unfair 方式

                 ReentrantLock  等待的线程还可以响应 interrupt 。

       3,  怎样自定义新的同步工具

怎么来借助现有的工具来定制自己有用的新的工具。这块做的还不多, 以后再仔细琢磨吧。              

 

       4,  非阻塞机制

              借助硬件的 CAS 也就是 comare and swap 。 如果比较成功再交换, 这整个动作都是 原子操作。  原理跟数据库中的 乐观锁的概念是一致的。 先拿出要操作的东西的当前值, 修改它。 在提交的时候 新值和老值都作为参数传入。  CAS 比较 传入的old value 与当前值做比较, 如果相同证明没有其它线程操作。否则直接返回false。 

 

        5, Java 内存模型  也就是JSR 133 里面的东东。主要涉及的有  re-order,  volatile, final,  happen-first 。 这个刚刚看过就略过。  它有提到 讲得比较多的 double lock 机制来实现 延迟创建 单例。  在新的 1.6 里面的 jvm 里面应该不会再 有什么 java 对象内存分配了 建构函数还在执行 就返回非null 的情况吧。 保险起见就用 JMM 里面明确的 happen-before 机制 像final 域的 initializer,内部static 类 的加载 应该都可以保证安全。  安全第一,呵呵。

 

 

暂时就这么多料,  中英文版本配合起来看 效果还可以。  机械工业出版社出版的那个中译本太水了, 很多时候得看英文版,  毕竟在Kindle DXG 看英文版没有实体中文书方便。  

 

分享到:
评论

相关推荐

    Java Concurrency in Practice 无水印pdf

    Java Concurrency in Practice 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...

    Java Concurrency in Practice

    Java Concurrency in practice

    Java Concurrency in Practice JAVA并发编程实践(中英文版)

    Using the concurrency building blocks in java.util.concurrent Performance optimization dos and don'ts Testing concurrent programs Advanced topics such as atomic variables, nonblocking algorithms, ...

    Java Concurrency in Practice JAVA并发编程实践中文版(全)

    Java Concurrency in Practice JAVA并发编程实践中文版(全)第二部分

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    《Java并发编程实践》是Java开发者必读的经典之作,由Brian Goetz等多位专家共同撰写。这本书深入浅出地探讨了Java平台上的并发问题,帮助读者理解和掌握如何编写高效、可靠且可维护的多线程应用程序。以下是该书...

    java并行编程(Java Concurrency in Practice) 英文版chm

    &lt;&lt;java并行编程&gt;&gt;英文版chm格式,英文名称&lt;Java Concurrency in Practice&gt;,一直想买这本书,但总是缺货,找到了电子版,分享给大家。 Java Concurrency in Practice By Brian Goetz, Tim Peierls, Joshua Bloch,...

    java concurrency in practice

    java concurrency in practice 经典的多线程编程书籍,英文版

    Java Concurrency in Practice.zip

    《Java Concurrency in Practice》是Java并发编程领域的一本经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和Doug Lea等专家共同编写。这本书深入探讨了Java平台上的多线程和并发编程,旨在...

    Java Concurrency In Practice Learning Note

    本笔记将深入探讨《Java Concurrency In Practice》这本书中的核心概念,结合Guava库的实际使用案例,帮助读者理解并掌握Java并发编程的精髓。 首先,我们来了解Java并发的基础知识。Java提供了丰富的并发工具类,...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...

    Java Concurrency In Practice.pdf

    《Java Concurrency In Practice》是一本关于Java并发编程的经典著作,由Brian Göetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea共同编写。本书深入探讨了Java平台上的多线程编程技巧,...

    Java Concurrency in Practice中文版

    这本书很出名吧,大家都知道吧,我靠,20个字的描述咋这么累啊。

    Java Concurrency in Practice电子书PDF加源码包

    java_concurrency_in_practice.pdf jcip-examples-src.jar jcip-annotations-src.jar 英文版是高清晰的,实战和实践都是同一帮人对英文版书的翻译,网传实战的翻译质量更好,实战是2012年出版的,应该是对前一版实践...

    Java并发实践英文版(Java Concurrency in Practice)

    - **书名**:《Java并发实践》(Java Concurrency in Practice) - **作者**:Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea - **出版社**:Addison Wesley Professional - **...

    Java.Concurrency.in.Practice.pdf

    通过以上章节的概述,可以看出《Java Concurrency in Practice》这本书全面地覆盖了 Java 并发编程的关键知识点和技术细节,是一本非常有价值的参考书籍。无论是对于初学者还是有经验的开发者来说,都能从中获得关于...

Global site tag (gtag.js) - Google Analytics