synchronized

阅读 / 问答 / 标签

synchronized底层原理是什么?

在虚拟机执行到monitorenter指令的时候,会请求获取对象的monitor锁,基于monitor锁又衍生出一个锁计数器的概念。当执行monitorenter时,若对象未被锁定时,或者当前线程已经拥有了此对象的monitor锁,则锁计数器+1,该线程获取该对象锁。当执行monitorexit时,锁计数器-1,当计数器为0时,此对象锁就被释放了。那么其他阻塞的线程则可以请求获取该monitor锁。扩展资料synchronized的特性1、原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。2、可见性可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。3、有序性有序性值程序执行的顺序按照代码先后执行。4、可重入性synchronized和ReentrantLock都是可重入锁。当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁。

synchronized 底层如何实现?什么是锁的升级,降级

synchronized 底层如何实现?什么是锁的升级,降级。 操作系统分为用户态和内核态,应用级别的程序会运行在用户态,不能访问硬件,操作系统内核的程序会运行在内核态,可以直接访问硬件。synchronized 是重量级锁,运行在虚拟机上,而虚拟机是应用级别的程序,运行在用户态,需要通过向操作系统内核程序发出申请,得到反馈获得锁,所以称sychronized为重量级锁。而cas的锁直接运行在用户态,所以称为轻量级锁。 CAS 叫自旋锁或者无锁,是轻量级锁,用于替代synchronized。 CAS的ABA问题可以用版本号解决。可是如果一个线程在比较值相同的情况下,在修改值之前另一个线程有可能提前修改当前值,这怎么避免呢?如下图: 在用c++编写的native方法compareAndSwap中,如果多线程的情况下,会有 lock cmpxchg这条指令来保证线程安全。在底层有多个cpu指向同一条语句(CAS)时,多个cpu通过一条总线通向这条语句,当lock时,会掐断这条总线,直到通向这条语句的cpu执行完成,总线又连上,允许其他cpu操作这条语句。 Markword的前四个字节中记录了synchronized的锁信息。 轻量级锁也称为自旋锁。除了重量级锁,其他锁都是在用户态完成。 锁升级指的是轻量级锁升级成重量级锁。 为什么自旋锁可以完成多线程的安全,为什么在竞争激烈的情况下要升级成重量级锁,因为自旋锁这些线程一直在while循环,消耗cpu的资源,而重量级锁这些线程排成队列,不消耗cpu资源,这里又可以分为公平锁和非公平锁。 偏向锁是默认启动的,但是有4s的延迟。 启动偏向锁为什么要延迟4秒:因为启动偏向锁效率不一定会提升。如果一开始就知道会有很多线程竞争锁,那么就不必打开偏向锁,从而提高效率。 Synchronized的底层实现: Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个: 从语法上讲,Synchronized可以把任何一个非null对象作为"锁",在HotSpot JVM实现中, 锁有个专门的名字:对象监视器(Object Monitor) 。 Synchronized总共有三种用法: 注意,synchronized 内置锁 是一种对象锁(锁的是对象而非引用变量), 作用粒度是对象 ,可以用来实现对临界资源的同步互斥访问,是 可重入 的。其可重入最大的作用是避免死锁 ,如: 子类同步方法调用了父类同步方法,如没有可重入的特性,则会发生死锁; monitorenter :每个对象都是一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下: (1). 如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者; (2). 如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1; (3). 如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权; monitorexit:执行monitorexit的线程必须是objectref所对应的monitor的所有者。指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。 monitorexit指令出现了两次,第1次为同步正常退出释放锁;第2次为发生异步退出释放锁; 通过上面两段描述,我们应该能很清楚的看出Synchronized的实现原理, Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

synchronized怎么读 英语synchronized怎么读

1、synchronized英[u02c8su026au014bkru0259nau026azd]美[u02c8su026au014bkru0259nau026azd],v.(使)同步,在时间上一致,同速进行;synchronize的过去分词和过去式。 2、[例句]which is synchronized with the heart rate monitor around your chest.与你胸口的心率监测器同步。

synchronized什么意思

synchronized是synchronize的过去分词synchronize美 ["su026au014bkru0259.nau026az] 英 ["su026au014bkru0259nau026az]v.同时化;【物】同步;【影视】声;使同时网络同步的;同步化;同步方法第三人称单数:synchronizes 现在分词:synchronizing 过去分词:synchronized 例句筛选1.It has no SIM card and allows contacts to be saved andsynchronized on the Internet.它没有SIM卡,允许在互联网上保存和同步联系人。2.Deactivates subscriptions that have not been synchronizedwithin the maximum distribution retention period.停用在最大分发保持期内尚未同步的订阅。

synchronized怎么读

iciba 很方便查询,还有语音发声

synchronized是什么意思

synchronized英["su026au014bkru0259nau026azd]美["su026au014bkru0259nau026azd]词典同步的网络同步; 关键字; 同步锁形近词:synchronisersynchronizersynchroniaed数据来源:金山词霸双语例句柯林斯词典英英释义百度百科百度知道新1The Modeler project that is being synchronized should not contain elements that are incomplete or not destined for implementation.正在进行同步的Modeler项目不应该包含不完整的或不是为实现预定的元素。

关于synchronized

你说的这个问题,这上面就有很详细的解决方案哦,他们的java教程很全面,你可以去了解下 参考资料:http://www.baidu.com/s?wd=%B1%B1%B7%E7%CD%F8&rsv_bp=0&rsv_spt=3&inputT=422

java中为什么wait()和notify()要和synchronized同时使用?

通常可以使用synchronized和notify,notifyAll以及wait方法来实现线程之间的数据传递及控制。对于对象obj来说:obj.wait():该方法的调用,使得调用该方法的执行线程(T1)放弃obj的对象锁并阻塞,直到别的线程调用了obj的notifyAll方法、或者别的线程调用了obj的notify方法且JVM选择唤醒(T1),被唤醒的线程(T1)依旧阻塞在wait方法中,与其它的线程一起争夺obj的对象锁,直到它再次获得了obj的对象锁之后,才能从wait方法中返回。(除了notify方法,wait还有带有时间参数的版本,在等待了超过所设时间之后,T1线程一样会被唤醒,进入到争夺obj对象锁的行列;另外中断可以直接跳出wait方法)obj.notify():该方法的调用,会从所有正在等待obj对象锁的线程中,唤醒其中的一个(选择算法依赖于不同实现),被唤醒的线程此时加入到了obj对象锁的争夺之中,然而该notify方法的执行线程此时并未释放obj的对象锁,而是离开synchronized代码块时释放。因此在notify方法之后,synchronized代码块结束之前,所有其他被唤醒的,等待obj对象锁的线程依旧被阻塞。obj.notifyAll():与notify的区别是,该方法会唤醒所有正在等待obj对象锁的线程。(不过同一时刻,也只有一个线程可以拥有obj的对象锁)要注意的是,wai,notify以及notifyAll方法的调用必须在相应的synchronized代码块之中。

atomic的原理,为什么线程不安全,@synchronized原理

一、定义 原子操作:不可分割的操作,在原子操作执行完毕之前,其不会被任何其它任务或事件中断。 二、原理 atomic修饰的属性,get或set方法只能被一个线程操作,保证数据的完整性 atomic与nonatomic内部实现的区别只是atomic对象setter和getter方法会加一个锁,而nonatomic并没有 三、线程不安全 1、如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,有3种可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。所以atomic可并不能保证对象的线程安全。 2、atomic仅作用于编译器生成的get和set,如果重写了set或get方法,atomic的原子性不起作用 synchronized介绍: https://www.jianshu.com/p/172811e6ecaf
 首页 上一页  1 2