多线程编程的时候,使用无锁结构会不会比有锁结构更加快?
这是毋庸置疑的,因为线程加锁其实是很吃资源的!
我们都知道,多线程模型中,为了避免线程之间的数据互串,影响数据安全,都会在方法或者指定的操作上加锁,最原始的加锁方式就是synchronize,这在以前被称为重度锁,因为加锁是违背了多线程模型的效率的!
加锁的原理是什么呢?以a=1a=b+1为例,编译器编译的时候会在这段代码之前加上一个标志比如说lock,同时在这段代码的后面加上标志unlock,在代码运行期间,一个线程进入这段代码之后先把lock置为加锁位,然后下一个线程过来访问这段代码的时候,发现已经上锁,就只能阻塞等待,等到第一个线程执行完了,把状态改了,然后通知后面的线程去继续执行!
当然这是最简化模型的锁,一般锁有读写锁,条件锁,自旋锁等会有不同的唤醒方式和不同的性能消耗!但无论如何,加锁都是在保证数据安全的条件下对多线程性能的污染!
那么,怎么避免加锁的性能下降呢?
1,从业务上避免大量锁结构的产生!
2,使用threadlocal,这能保证每个线程中的数据不会互相污染!
3,多读少写的情况,使用读写锁!
4,自旋锁会对cpu形成挑战,虽然是线程占用时间很少的锁!
5,锁的粒度尽量小:能在方法内的锁,就不要占用整个方法
原文标题:java 线程状态 多线程编程的时候,使用无锁结构会不会比有锁结构更加快?,如若转载,请注明出处:https://www.dnheimuer.com/tougao/18891.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「东宁黑木耳网」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。