并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
线程就是实现异步的一个方式。
多线程只是我们实现异步的一种手段。
实现异步可以采用多线程技术或则交给另外的进程来处理。
异步和同步是相对的,
同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
异步是当一个请求发送,而不用等待其结果的返回而可以做其它的事情。
3、线程互斥:
线程互斥可以看成是一种特殊的线程同步。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。
当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,
其它要使用该资源的线程必须等待,直到占用资源者释放该资源。
4、多线程的三个特性:
原子性、有序性、可见性
5、如何保证线程同步?
java笔记–关于线程同步(7种同步方式): https://www.cnblogs.com/XHJT/p/3897440.html
<MFC笔记> 四种线程同步(或互斥)方式小结:https://blog.csdn.net/ebowtang/article/details/29905309
死锁 :
死锁 :两个或两个以上的线程均持有对方不会释放的资源(在相互请求这些不释放的资源而处于一种永久的等待状态。)
一句话描述:多个并发线程因争夺(互斥)资源而产生相互等待的现象。
典型的两种死锁的情形:
(1)线程自己锁住自己:
如果一个线程先后调用两次lock(),由于锁已经被占用,该线程会一直挂起 等待占有锁的线程释放锁,然而锁正是被自己占用,
该线程又被挂起而没机会释放锁。因此,就永远处于挂起状态了,于是就形成了死锁。
(2)多线程抢夺资源被困
线程1锁住了A,接着尝试对B进行加锁,同时线程2已经锁住了B,又尝试着对A加锁。
为了得到彼此的资源A和B,线程1和线程2将永远的阻塞下去,这样就发生了死锁。
3、死锁的产生四个必要条件:
互斥条件:资源不能被共享,具有排它性,即一个资源只能被一个线程占用,直到被该线程释放。
请求与保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
非剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用。
循环等待条件:系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
4、引起死锁的原因、如何避免死锁?