zoukankan      html  css  js  c++  java
  • Java的编程逻辑--15章 并发基础

    1、run()和start()的区别

    2、线程的基本属性和方法

    1. id:一个递增的整数,每创建一个线程就加一
    2. name
    3. 优先级:从1到10,默认为5,会映射到系统中的优先级。数字越大,要优先级越高
    4. 状态: 
      • NEW :还没调用start 
      • RUNABLE:正在执行run或者正在等待cup分配时间
      • BLOCKED:被阻塞
      • WAITING:被阻塞
      • TIMED_WAITING:被阻塞
      • TERMINATED:结束
    1. 是否daemo线程
    2. sleep方法, 单位是毫秒
    3. yield方法,建议让出cpu
    4. join方法,join(0)或join()标示无限期等待
    5. 过时方法 stop(),suspend(),resume(),已经过时,不应再使用

    3、竞态条件:当多个线程访问和操作同一个对象时,最终执行结果与执行时序有关,可能正确也可能不正确。

        解决方案:

    • 使用synchronized关键字
    • 使用显示锁
    • 使用原子变量

    4、内存可见性:多个线程可以共享访问和操作相同的变量,但一个线程对一个共享变量对修改,另一个线程不一定马上就能看到,甚至永远也看不到。因为涉及到寄存器和各级缓存。

      解决方案:

    • 使用volatile关键字
    • 使用synchronized关键字

    5、synchronized

    synchronized可用于修饰类的实例方法(保护this),静态方法(保护类对象),代码块(任意对象)。

    synchronized保护的是对象而非代码,只要访问的是同一对象的synchronized方法,即使是不同的代码,也会被同步顺序执行。

    所以多个线程是可以同时执行同一个synchronized实例方法的,只要他们访问的对象是不同的即可。

    可重入性:通过记录锁的持有线程和持有数量来实现的。

    保证内存可见性:在释放锁时,所有写入都会写回到内存,而获得锁后,都会从内存中读最新数据。

    如果只是保证内存可见性,synchronized的成本有点高,

    6、volatile : java会在操作对应变量时插入特殊的指令,保证读写到内存到最新值而非缓存到值,可以解决内存可见性问题

    7、死锁

    • 尽量避免在持有一个锁到同时取申请另一个锁
    • 如果确实需要多个锁,所有到代码应该按照相同到顺序取申请锁

    8、同步容器及注意事项

    Collection中的一些方法,可以返回线程安全的同步容器

    synchronizedXXX()

    9、并发容器,专门为并发设计,因为同步容器的性能比较低

    • CopyOnWriteArrayList
    • ConcurrentHashMap
    • ConcurrentLinkedQueue
    • ConcurrentSkipListSet

    10、线程的基本协作机制 :wait/notify

    常见的协作场景:

     

  • 相关阅读:
    hadoop中使用hprof工具进行性能分析
    hadoop map端的超时参数
    一次hadoop集群机器加内存的运维过程
    算法学习-回溯法
    项目中Map端内存占用的分析
    hadoop Shuffle Error OOM错误分析和解决
    算法学习-动态规划
    项目中Map端数据处理不均匀性分析
    《Hadoop技术内幕》读书笔记——Task运行过程分析
    jsp里更新Clob类型字段数据
  • 原文地址:https://www.cnblogs.com/lakeslove/p/9541623.html
Copyright © 2011-2022 走看看