周会材料:高并发程序设计<一>

第一章

几个概念

  • 同步:一次方法调用须等到其返回后才能有后续
  • 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续
  • 并发:任务以极短的时间交替进行
  • 并行:任务同时进行
  • 临界区:公共资源
  • 阻塞:临界区资源被占用,须等待前一线程释放。
  • 死锁:彼此占用所需资源,都无法继续进行
  • 饥饿:线程优先级太低,总是无法获得资源
  • 活锁:线程彼此主动释放资源给对方,导致无法拿到所有资源正常执行

并发级别:

  • 阻塞:临界区加锁,得不到锁就会被挂起等待直到得到所有资源(悲观)
  • 无饥饿:公平的锁,所有主程序都有机会执行
  • 无障碍:大家都能拿到资源,出了冲突就回滚(乐观),可能导致无限回滚,无法执行完任意一个线程
  • 无锁:无锁的并行都是无障碍的,不同的是必然会保证有一个线程能够在有限步完成执行
  • 无等待:要求所有线程在有限步内完成(一种实现情况是:读时不加控制,写时修改在副本上伺机返回)

JMM(Java的内存模型)建立原则:原子性,可见性,有序性

原子性:操作不可分,一旦执行不会被干扰

可见性:一个线程修改了一个共享变量的值,其他变量能否立刻知道此修改

有序性:程序执行顺序问题(由指令重排导致)

第二章

1.进程与线程

2.线程的基本操作

  • 新建线程:继承Thread或者实现Runable/Callable,重写run,调用start。
  • 终止线程:尽量不使用stop()方法
  • 线程中断:interrupt()——增强的stop方法

  • 等待与通知(与锁有关)

    wait(),notify()必须是包含在synchronzied语句中的----notify()随机唤醒一个线程,notifyAll()全部唤醒。

  • 挂起与继续执行(废弃方法)
  • 等待线程结束(join())与谦让(yield)

可以看出来当前等待对象threadA会一直阻塞,直到被等待对象threadB结束后即isAlive()返回false的时候才会结束while循环,当threadB退出时会调用notifyAll()方法通知所有的等待线程.

 public static native void yield();这是一个静态方法,一旦执行,它会是当前线程让出CPU,但是,需要注意的是,让出的CPU并不是代表当前线程不再运行了,如果在下一次竞争中,又获得了CPU时间片当前线程依然会继续运行.另外,让出的时间片只会分配给当前线程相同优先级的线程.

 3.对于经常修改的字段类型,可以使用字段volatile确保线程改动数据后其他线程可以看到此改动。

 4.线程组

5.守护线程,执行系统的工作线程,特点是当只此线程时虚拟机会停止(Daemon)———可自定义,

6.线程优先级

7.synchronized关键字

 

并发下的错误:

ArrayList:线程不安全(访问时破坏了内部一致性、访问时保存容器大小的变量访问异常)——————使用Vector 

HashMap:线程不安全(可能结构破坏出现环导致无法退出)——————————————————使用ConcurrentHashMap

i++本质:i=Integer.valueOf(i.intValue()+1);其中,Integer.valueOf是一个工厂方法,每次创建一个新的Integer对象,并将其引用复制给i

i++

posted @ 2019-12-11 16:47  lvoooop  阅读(146)  评论(0编辑  收藏  举报