java并发一 多线程编程

java线程状态http://my.oschina.net/mingdongcheng/blog/139263

死锁:彼此都在等对方释放的锁,结果永远等下去

阻塞:因为缺少某个条件,导致让出了cpu,并且不再是就绪状态。

类型分为等待阻塞(o.wait)对应waitting queue、同步阻塞(lock)对应lock pool、其他阻塞(sleep、join、同步IO,满足后自动变成就绪)

 

一、OS的封装

        OS支持进程,支持cpu调度,所以多进程的同步由OS来实现(比如进程堵在磁盘访问的队列上),

但是同一个进程内的多线程,属于应用的范畴,所以需要程序员自己来实现

二、Linux对多线程的支持

        linux没有单独实现线程,而是直接使用轻量级进程来模拟的(实现了pthread的语义),利用copyOnWrite来提高效率,这样进程间通信的方式,可以用在线程同步。linux内核提供的同步的工具包括:

1、原子操作 2、自旋锁(spin lock)循环询问和等待(避免被换出和换入打破cache等优化)3、mutex 4、readWriteLock  5、condition 6、semaphore

三、pthread

        POSIX threads 是类unix操作系统的多线程标准API(windows有移植版本),提供的同步方式包括 Mutex、condition、semaphore

1、Mutex 保护的区域(代码片段),一次只会进入一个线程(面向过程),相关api是lock, unlock

2、condition 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。这种环境下 条件本身同时被多个线程访问,所以需要加锁保护条件。线程在改变条件状态前先要锁住互斥量。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步。条件变量要和互斥量相联结,以避免出现条件竞争--一个线程预备等待一个条件变量,当它在真正进入等待之前,另一个线程恰好触发了该条件。(目的是等到后再执行,现在则永远等不到信号)

wait(线程释放mutex,被挂起到等待队列,不再占用cpu,被signal唤起前,会自动加锁;前面的过程自动进行) 

signal 唤醒同一个condition上wait的线程

3、semaphore 相当于封装了mutex+condition,且支持多个条件值(不需要同步),相关api wait post

 

四、java的封装

        java对并发的封装有几个层次,包括 

1、基础的lock、condition、原子操作,分别在java.util.concurrent.locks和java.util.concurrent.atomic

2、Thread类,syncronized(悲观锁,阻塞) volatile(修改的可见性) 等关键字

3、并发的数据结构,阻塞队列、线程池、信号量等并发的组件(java.util.concurrent)

4、Thread类中几个方法的含义

join 获得某个线程的锁,之后wait,所以可以实现前一个线程结束后才执行下一个

wait(属于Object) 阻塞到当前对象,释放当前Object上的锁

static void yield() 暂停当前正在执行的线程对象,并执行其他线程。不释放锁

static void sleep(long millisec) 让出cpu,不释放锁

5、实际中需要注意的

syncronized太消极,考虑用原子类型、读写锁等来代替

注意减少锁住的粒度,考虑使用ConcurrentHashMap等数据结构

考虑使用不基于锁的同步机制(硬件的指令支持)

 

五、syncronized封装的隐式锁与显示的Lock的区别(后者更灵活,进而在特定情况下更高效,缺点是使用复杂)

1、可中断申请 2、尝试型申请 3、可以插队提高吞吐率 4、可以精确唤醒(signal)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值