
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数程序员都在学习和使用的一种编程开发语言,今天我们就通过案例分析来简单了解一下,Java编程sychronized线程安全分享。
sychronized的工作原理是,当多线程应用访问sychronized共享变量的时候,先获取对该变量的锁,如果该变量已经有其他的(非当前线程的)锁存在的情况下,当前线程必须阻塞等待,否则,如果该变量存在当前线程的锁,或者不存在锁的话,则当前线程获得执行权,同时锁定该共享变量。
所以,当前线程可以多次获得该共享变量的锁,多次上锁必须多次释放锁。
JDK6之后,JAVA对sychronized的锁机制进行了向“轻量级锁”方向的改善,增加了自旋锁、锁消除、锁粗化、偏向锁等完善机制。
所有的这些改造,都是本着一个原则:能不上锁就不上锁,因为上锁和锁释放意味着线程切换,线程切换操作需要耗费系统资源。
JDK对sychronized锁机制的改造包括:
自旋锁:基于绝大部分应用获得锁之后的应用处理都会在短时间内完成这一假设,让请求线程在获得锁之前先自旋一会儿---cpu空转,啥也不干只是等待锁释放。
锁消除:代码要求加锁,但是虚拟机判断不需要加锁的情况,就不加锁。
锁粗化:比如一段代码在循环内加锁,这种情况会导致频繁加锁,虚拟机会适当扩大锁范围,变为一个锁,避免频繁加锁。
偏向锁:锁偏向于一个获取他的线程,如果在接下来的执行过程中,该锁一直没有被其他线程获取,则持有偏向锁的线程将永远不需要再同步。
偏向锁实际上只是在对象头设置了一个标志并记录了获取该偏向锁的线程ID。但是记录线程ID占用了对象头中记录该对象HashCode的位置,所以,请求过HashCode的对象无法使用偏向锁。
总结:sychronnized通过锁实现线程安全,能够解决线程安全问题。但是sychronized是重量级同步机制,会对系统性能造成一定影响。
但是,需要注意的是,sychronized只是解决了锁对象的线程安全问题,锁对象并非一个应用的全部,应用是否存在线程安全问题是一个非常复杂的问题,具体问题需要具体分析,sychronized并非是线程安全问题的万能钥匙,并不是说只要使用了sychronized,就一定解决了线程安全问题。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。