----------------------------------------------《Java并发编程实战》读书笔记------------------------------------------------------------------------------

第二章 线程安全性

java同步 1、sychronized
  2、volatile类型
  3、显示锁
  4、原子变量
性能优化之原则:首先保证代码能正确运行,然后再提高代码速度。并且,只是当性能测试结果和应用需求需要提高性能、
并且测量结果表明该种优化在实际环境中确实能够带来性能提升时,才进行优化。

1、无状态对象一定是线程安全的,例如无状态servlet (大多数servlet都是无状态的)

2、原子性
   比如 count++就不是原子性操作,它包括了 读取count —— count值+1 —— 新值放回count 三个操作
   这样的非原子操作在多线程环境下就会出现线程安全性问题
  
   并发编程中,由于多个线程交替执行不恰当的执行时序而出现不正确的结果,称为竞态条件。
   最常见的一种静态条件: 先检查,后执行。 即通过一个可能已经是失效的监测结果来决定下一步的执行动作。
  
   原子变量
      多线程累加计数使用java.util.concurrent.atomic.AtomicLong类型代替long,其incrementAndGet()方法实现自增加1,这是线程安全的。
     
      原子变量不能解决所有并发问题,只能对某个变量进行原子操作,如果是一段过程,则没法进行原子操作。多个变量进行依赖的情况也无能为力。
      例子:(在一个servlet.service()方法里,建两个AtomicReference存一对值key-value,每次查询key命中就返回value,如果不命中就设置新的key-value)
     
3、   内置锁
       即代码同步块synchronized ,是一种互斥机制,任何一个执行同步代码块的线程,都不可能看到其他线程在执行由同一个锁保护的同步代码块。
       好比是一个每次只能出现一个人的房间,其他人要想进入这个房间,必须等里面的这个人出去,并且每次房间里最多只能有一个人。
      
       e.g. 可以把上面的那个servlet的service()方法设置为public synchronized void service(),保证了线程安全性,但性能太低。
          每次只有一个线程能访问service方法,而service又是servlet的主要方法,这相当于servlet变成单线程的了
          
4、   重入
       指的是java内置锁的一种特性,线程在重复获取一个已经由它持有内置锁的时候,是可以成功的。
       public class Widget{
         public synchronized void doSomething(){}
        }
        
        public class LoginWidget extends Widget{
         public synchronized void doSomething(){
           ...
           super.doSomething();
          }
         }
    子类调用自己的doSomething方法持有锁,然后在方法体内再调用父类的doSomething方法,请求的是同一个锁,
    如果没有重入特性,那么此处将会发生死锁。

5、  同步的两个方面 
          1、线程安全性
   2、内存可见性(memory visibility)
          线程在使用一个资源的时候其他线程不可以修改这个资源;同时,当线程对一个资源的状态进行了修改之后,其他线程应该可以看得见这个变化。即为内存可见性。

最新文章

  1. InnoDB全文索引:N-gram Parser【转】
  2. PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)
  3. 使用Eclipse开发Java Web过程中Debug调试的使用方法
  4. WPF基础知识、界面布局及控件Binding
  5. hdu_3555 bomb
  6. AC自动机 & Fail树 专题练习
  7. [转载]C#设置开机启动
  8. 【Java基础】Java设计模式简介
  9. 单/多行文本添加省略号 (o゚ω゚o)
  10. Mysql----浅入浅出之视图、存储过程、触发器
  11. mybatis 入门进阶之 pojo
  12. Python基础知识:集合
  13. js中Math之random,round,ceil,floor的用法总结
  14. Django model 中的字段解释
  15. This page is about building Firefox Desktop
  16. 重温jQuery
  17. 【转载】ATL问题集
  18. 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
  19. OpenCV 4 Android
  20. Unity3D手机游戏开发

热门文章

  1. code1002 搭桥
  2. Sketch小妙招:在线分享设计
  3. Mybatis Blob和String互转,实现文件上传等。
  4. vue移动端h5页面根据屏幕适配的四种方案
  5. 2018.09.09 UVa10529 - Dumb Bones(期望dp)
  6. java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing,
  7. 用原生的javascript 实现一个无限滚动的轮播图
  8. AngularJS标准Web业务流程开发框架-4.AngularJS四大模块之一:Controller
  9. 重大发现 springmvc Controller 高级接收参数用法
  10. Linux上查看造成IO高负载的进程