线程锁synchronized 如何理解线程锁进程锁和文件锁等各种锁?
如何理解线程锁进程锁和文件锁等各种锁?
线程锁是锁线程的,锁住禁用,如果4线程的CPU锁一个线程剩余三个(如果可以锁的话),就像四车道封锁一条车道还剩3个车道可以跑车;进程锁是锁进程的,进程就是正在运行的程序,锁住进程就是锁住程序禁止程序的任何操作,就像锁住汽车不能开车一样。文件锁是锁文件的,文件锁住就无法使用,必须解锁才可以使用。
多线程编程的时候,使用无锁结构会不会比有锁结构更加快?
这是毋庸置疑的,因为线程加锁其实是很吃资源的!
我们都知道,多线程模型中,为了避免线程之间的数据互串,影响数据安全,都会在方法或者指定的操作上加锁,最原始的加锁方式就是synchronize,这在以前被称为重度锁,因为加锁是违背了多线程模型的效率的!
加锁的原理是什么呢?以a=1a=b+1为例,编译器编译的时候会在这段代码之前加上一个标志比如说lock,同时在这段代码的后面加上标志unlock,在代码运行期间,一个线程进入这段代码之后先把lock置为加锁位,然后下一个线程过来访问这段代码的时候,发现已经上锁,就只能阻塞等待,等到第一个线程执行完了,把状态改了,然后通知后面的线程去继续执行!
当然这是最简化模型的锁,一般锁有读写锁,条件锁,自旋锁等会有不同的唤醒方式和不同的性能消耗!但无论如何,加锁都是在保证数据安全的条件下对多线程性能的污染!
那么,怎么避免加锁的性能下降呢?
1,从业务上避免大量锁结构的产生!
2,使用threadlocal,这能保证每个线程中的数据不会互相污染!
3,多读少写的情况,使用读写锁!
4,自旋锁会对CPU形成挑战,虽然是线程占用时间很少的锁!
5,锁的粒度尽量小:能在方法内的锁,就不要占用整个方法
志在用通俗易懂的方式学习高新技术,更多的技术分享,会不定时更新,敬请关注。。
感觉C 很简单,但为何这么多劝退的?
写cpp,语法的痛苦点模板,等你模板报错达到几百行的时候,你就会明白劝退 1。第二个痛苦点,内存操作,包括内存越界,内存泄露,内存脏数据,共享内存,内存池等所有相关,迟早会遇到程序崩溃,劝退 1。第三个痛点,锁和多进程多线程还有协程,以及管道通信,消息机制。这些都是操作系统相关的知识,要搞明白不比学cpp简单。劝退 1。第四个,既然用了cpp,那就迟早要用到so,dll,对应的debug噩梦来了,服务器上用gdb调试带so的多进程多线程程序的难度和复杂度,会让人迷失。劝退 1。第五个,平台,编译器不同,优化和不优化导致程序运行结果不同,这个时候我都是无语问苍天。第六个,宏噩梦,dll依赖噩梦,cpp编译时间长噩梦,以及系统突然升级(安全漏洞修复)导致某个库不兼容的噩梦。没经历过的人是体会不到的。
线程锁synchronized 线程锁的作用 java线程锁有几种
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。