草庐IT

transaction-synchronized

全部标签

Synchronized关键字的底层原理?

1.synchronized的基本使用在现实场景中,抢票代码,如果不加锁,就会出现超卖或者一张票卖给多个人Synchronized对象锁采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程再想获取这个对象锁时就会阻塞住,代码如下publicclasssynchronizedTest{//创建一个静态对象作为锁staticObjectlock=newObject();//初始票数intticketNum=20;//获取票的方法,使用synchronized修饰确保线程安全publicsynchronizedvoidgetTicket(){//使用当前对象作为锁synchronized(

java - 在Java中,线程切换可以发生在synchronized block 中吗?

我了解同步块(synchronizedblock)或方法将阻塞所有线程,直到其中的线程“离开”为止。我想知道,当线程在同步块(synchronizedblock)内执行时,是否会发生上下文切换?以我的理解,它不应该。谢谢! 最佳答案 cancontextswitchinghappenwhenthreadisexecutinginsidesynchronizedblock?是的,上下文切换也可以发生在synchronizedblock内。唯一不同的是,没有其他线程能够进入相同的synchronizedblock(或同一对象上的任何其他

java - 为什么 "synchronized"对多态没有作用

synchronized不是方法签名的一部分。但是当我们覆盖一个方法时,决定被覆盖的方法是否编译的不仅仅是方法签名。例如,我们不能添加或扩大检查异常为什么synchronized在多态性中没有作用。一个synchronized方法不应该在没有放置synchronized的情况下被覆盖。因为使用父类(superclass)变量的人可能认为所有方法都是线程安全的。但非同步方法应该允许被synchronized覆盖,因为它增加了更多的功能,但另一方面用户不会遇到任何错误,除了时间延迟。我正在寻找一个合乎逻辑的解释,它可以阐明“为什么这样设计”。 最佳答案

java - 如何检查线程是否在同步块(synchronized block)或方法内?

我的Java应用程序使用两个线程。从历史上看,有同步方法和专用锁对象在使用中。我需要知道当前线程是否有锁,是通过方法还是通过对象。我该怎么做? 最佳答案 当进入同步方法时,VM会在当前对象上设置一个锁。因此下面的代码具有相同的效果:synchronizedvoidsyncMethod(){//dosomething}voidsyncManually(){synchronized(this){//dosomething}}这意味着同步方法与synchronized(lock){//dosomething}代码中的任何位置。您可以使用T

java - 在可以避免的情况下需要在迭代时手动同步 Synchronized 列表吗?

我的问题是关于synchronizedList方法集合类。Javadocs说:用户在遍历返回的列表时必须手动同步它:Listlist=Collections.synchronizedList(newArrayList());...synchronized(list){Iteratori=list.iterator();//Mustbeinsynchronizedblockwhile(i.hasNext())foo(i.next());}虽然其他方法不需要手动同步。我查看了Collections类的源代码并且发现同步化已经针对所有方法进行了处理,例如addpublicbooleanadd

java - "inconsistent synchronization"是什么意思?

这是我的Java1.6类:publicclassFoo{privateArrayListnames;publicvoidscan(){if(names==null){synchronized(this){this.names=newArrayList();//fillthearraywithdata}}}}Findbugs说:Inconsistentsynchronizationofcom.XXX.Foo.names;locked40%oftime这是什么意思,我做错了什么?当两个或多个客户端同时调用Foo.scan()时,我试图避免出现问题。 最佳答案

java - 为什么@Scheduled 注释不适用于@Transaction 注释。 Spring Boot

这个问题在这里已经有了答案:Spring3's@Transactional@SchedulednotcommittedtoDB?(3个答案)关闭2年前。我有一个问题:为什么当我们使用@Scheduled和@Transaction注释方法时,事务不起作用?我知道@Scheduled调用我的类而不是Spring创建的代理类,但无法理解这种行为。importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.transaction.annotation.Transactional;@Ser

java - hibernate/Ehcache : evicting collections from 2nd level cache not synchronized with other DB reads

我有一个使用JPA、Hibernate和ehcache的应用程序,以及Spring的声明式交易。数据库上的负载相当高,因此所有内容都被缓存以加快速度,包括Collection品。现在集合被单独缓存已经不是什么secret了来自拥有它们的实体,所以如果我删除一个作为此类元素的实体缓存集合,持久化一个应该是一个元素的实体,或者更新一个实体使得它从一个集合移动到另一个集合,我必须执行驱逐手工制作。所以我使用了一个hibernate事件监听器,它跟踪实体被插入、删除或更新并保存该信息以用于在Spring中注册的事务同步事务管理器采取行动。一旦事务已提交。现在的问题是很多时候,一些其他并发事务设

java - @Transactional 是做什么的?

这个问题在这里已经有了答案:Spring-@Transactional-Whathappensinbackground?(6个答案)关闭3年前。我知道这可能是重复的,具有讽刺意味的是,在我开始到处阅读之前,我以为我知道它的用途(不用说但我还是要说,不对的地方请指正):它使程序员不必使用transaction.begin()和commit()。如果您有一个调用两个DAO方法的方法,这两个DAO方法通常每个都有包含实际操作的transaction.begin和transaction.commit并调用它们,这将导致两个事务(如果以前的DAO方法也应该回滚,则可能会出现回滚问题)。但是如果您

java - 为什么你永远不应该在可选的 java 对象上使用 synchronized

我正在学习java可选包装器,为此我正在阅读以下内容tutorial但是我有一个简单的问题没有在文章中得到解答:在第25项:避免对可选对象使用身份敏感操作中,他们提到从不使用像这样的同步方式的可选对象:Optionalproduct=Optional.of(newProduct());synchronized(product){...}但没有解释为什么,所以请这里的任何人向我解释为什么这是一种不好的做法??? 最佳答案 因为[value-basedclasses]arefreelysubstitutablewhenequal,mea