线程同步

来源:互联网 发布:数据找回软件 编辑:程序博客网 时间:2024/04/27 17:39

为什么需要线程同步?”
线程间共享代码和数据可以节省系统开销,提高程序运行效率,但同时也导致了数据的访问冲突问题,如何实现线程间的有机交互、并确保共享资源在某些关键时段只能被一个线程访问,即所谓的线程同步”(Synchronization)就变得至关重要。

 

临界资源
多个线程间共享的数据称为临界资源(Critical Resource),由于是线程调度器负责线程的调度,程序员无法精确控制多线程的交替顺序。因此,多线程对临界资源的访问有时会导致数据的不一致行。

 

互斥锁

 

每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

Java对象默认是可以被多个线程共用的,只是在需要时才启动“互斥锁”机制,成为专用对象。

关键字synchronized用来与对象的互斥锁联系

当某个对象用synchronized修饰时,表明该对象已启动“互斥锁”机制,在任一时刻只能由一个线程访问,即使该线程出现堵塞,该对象的被锁定状态也不会解除,其他线程任不能访问该对象。

 

Synchronized(对象)块时可填写任意对象

Synchronized函数时默认的对象为this

 

线程同步的好处:解决了线程安全的问题。

弊端:可能造成死锁。 

即两个线程AB用到同一个对象s(s为共享资源),且线程A在执行中要用到B运行后所创造的条件。在这种前提下A先开始运行,进入同步块后,对象s被锁定,接着线程A因等待B运行结束而进入阻塞状态,于是B开始运行,但因无法访问对象s,线程B也进入阻塞状态,等待s被线程A解锁。最终的结果:两个线程互相等待,都无法运行。

分析:子线程t并未锁定任何共享资源,只是因为无法访问共享资源sb而陷入阻塞状态。主线程则是因为串行加入了子线程t而进入阻塞状态,且必须要等线程t运行完毕才可能恢复运行并解除对共享资源的锁定,双方僵持、互不相让,导致进入“死锁”状态。

原创粉丝点击