线程的同步与死锁
一个程序处理资源时,全部由主线程处理的处理方法一定比较慢,应该采用多线程处理机制,利用主线程创建出多字子线程一起进行资源的操作,处理效率会比只由一个主线程处理更高。
同步问题
同步是多线程开发的一个重要的概念,多个线程处理同一资源有可能出现不同步的问题。此时必须使用同步操作。
同步操作是一个代码中的多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成后才可以继续进行。
在Java里面实现线程的同步可以使用synchronized关键字:
- 同步代码块:利用synchronized包装的代码块,但是需要指定同步对象,一般设置为this;
- 同步方法:利用synchronized定义的方法
加入同步后明显比不加入同步慢很多,所以同步的代码性能会很低,但是数据的安全性会高,或者可以成为线程安全性高。
同步和异步有什么区别,在什么情况下分别使用它们? |
如果一块数据要在多个线程间进行共享。例如,正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效。 |
死锁
同步就是指一个线程要等待另外一个线程执行完毕才会继续执行的一种操作形式。
死锁就是指两个线程都在等待彼此先完成,造成了程序的停滞状态,一般程序的死锁都是在程序运行时出现的。
多个线程访问同一个资源时需要考虑到哪些情况?有可能带来哪些问题? |
● 多个线程访问同一个资源时,考虑到数据操作的安全性问题,一定要使用同步操作。同步有以下的两种操作模式: ○ 同步代码块:synchronized(指定对象){代码}; ○ 同步方法:public synchronized 返回值 方法名称(){代码}; ● 过多的同步操作有可能会带来死锁问题,导致程序进入停滞状态 |