草庐IT

transaction-synchronized

全部标签

java - Spring @Transactional注解: Self Invocation

我知道当从同一个类内部调用事务方法时,它不会在事务中运行。Spring为事务方法创建代理并将它们包装在try-catchblock中,并在发生异常时回滚。考虑以下场景:@TransactionalpublicvoidsaveAB(Aa,Bb){saveA(a);saveB(b);}@TransactionalpublicvoidsaveA(Aa){dao.saveA(a);}@TransactionalpublicvoidsaveB(Bb){dao.saveB(b);}假设saveAB被另一个对象调用并且在saveB中发生异常,所以saveA成功完成但saveB没有。据我所知,即使sa

java - 如果线程在同步块(synchronized block)中抛出异常会发生什么

考虑多个线程正在尝试访问临界区,一个线程在同步块(synchronizedblock)内发生异常会发生什么,它具有wait()和notify()来累积和释放锁。 最佳答案 同步监视器将被释放:“如果主体的执行曾经完成,无论是正常还是突然,都会在同一监视器上自动执行解锁操作。”Java语言规范17.1.Synchronization.其他线程将能够继续同步,并调用wait和notify。如果发生异常的线程持有一些关键的程序逻辑资源,您可能需要使用try-finally来确保它被释放。 关于

java - synchronized 关键字是否会阻止 Java 中的重新排序?

假设我在Java中有以下代码a=5;synchronized(lock){b=5;}c=5;同步是否会阻止重新排序?a、b、c之间没有依赖关系。会先分配给a,然后分配给b,然后分配给c吗?如果我没有同步,语句可以以JVM选择的任何方式重新排序,对吗? 最佳答案 将赋值锁定到b至少会在赋值前引入一个获取栅栏,在赋值后引入一个释放栅栏。这可以防止将获取栅栏之后的指令移动到栅栏上方,以及将释放栅栏之前的指令移到栅栏下方。使用↓↑符号:a=5;↓b=5;↑c=5;↓防止指令被移动到它上面。↑防止指令被移动到它下面。

java - JPA+Hibernate+@Transactional注解的spring事务支持的奇怪行为

我在相对简单的用例上发现了非常奇怪的行为,可能因为对spring@Transactional性质的了解不深,我无法理解它,但这很有趣。我有一个简单的用户dao,它扩展了springJpaDaoSupport类并包含标准保存方法:@TransactionalpublicUsersave(Useruser){getJpaTemplate().persist(user);returnuser;}如果在我向同一个类添加新方法之前工作正常:UsergetSuperUser(),此方法应该返回isAdmin==true的用户,如果数据库中没有super用户,方法应该创建一个。这就是它的样子:pub

java - 当我以静态方式同步块(synchronized block)调用 wait() 时,为什么 Java 抛出 java.lang.IllegalMonitorStateException?

我不明白为什么Java会在这段代码中从主题中抛出异常。有人能给我解释一下吗?classWaitimplementsRunnable{publicvoidrun(){synchronized(Object.class){try{while(true){System.out.println("Beforewait()");wait();System.out.println("Afterwait()");}}catch(InterruptedExceptione){e.printStackTrace();}}}}publicclassObjectMethodInConcurency{publ

java - 构造函数中的同步块(synchronized block)有什么用?

我们不能使构造函数synchronized,但可以在构造函数中编写synchronized。什么情况下会出现这样的要求?我被逗乐了。packagecom.simple;publicclassTest{publicTest(){synchronized(this){System.out.println("Iamcalled...");}}publicstaticvoidmain(String[]args){Testtest=newTest();System.out.println(""+test);}@OverridepublicStringtoString(){return"Test[

java - 什么原语用于实现 synchronized 关键字?

当我们在java中使用synchronized关键字时,到底使用了哪个同步原语?锁、信号量、监视器、互斥量?编辑:JVM如何在native级别实现锁? 最佳答案 在字节码级别,java有monitorenter和monitorexit操作,记录在thispageofTheJavaVirtualMachineSpecification,下面粘贴了片段(objectref是操作的操作数,取自堆栈):monitorenter片段Eachobjecthasamonitorassociatedwithit.Thethreadthatexecu

面试官问synchronized为什么性能会比Lock慢一点

前置思考实现锁应该考虑的问题如何获取资源(锁)?获取不到资源的线程如何处理?如何释放资源?资源释放后如何让其他线程获取资源?由此可以得出实现一把锁,应该具备哪些逻辑锁的标识需要有个标识或者状态来表示锁是否已经被占用。线程抢锁的逻辑多个线程如何抢锁,如何才算抢到锁,已经抢到锁的线程再次抢锁如何处理等等。线程挂起的逻辑线程如果抢到锁自然顺利往下运行了,而那些没有抢到锁的线程怎么处理呢?如果一直处于活跃状态,cpu肯定是吃不消,那就需要挂起。具体又如何挂起呢?线程存储机制没有抢到锁的线程就挂起了,而且被挂起的线程可能有很多个,这些线程总要放在某个地方保存起来等待唤醒,然而这么多被挂起的线程,要唤醒哪

Synchronized详解、同步互斥自旋锁分析及MonitorJVM底层实现原理

状态对象如果一个对象有被修改的成员变量被称为有状态的对象相反如果没有可被修改的成员变量称为无状态的对象。示例:publicclassMyThreadTest{publicstaticvoidmain(String[]args){Runnabler=newMyThread();Threadt1=newThread(r);Threadt2=newThread(r);t1.start();t2.start();}}classMyThreadimplementsRunnable{/***如果一个对象有被修改的成员变量被称为有状态的对象*相反如果没有可被修改的成员变量称为无状态的对象**由于两个线程同时

Java 同步块(synchronized block)与 concurrentHashMap 与 Collections.synchronizedMap

假设如果有一个同步方法并且在该方法中,我会像这样更新一个hashmap:publicsynchronizedvoidmethod1(){myHashMap.clear();//populatethehashmap,takesabout5seconds.}现在当method1正在运行并且hashmap正在重新填充时,如果有其他线程试图获取hashmap的值,我假设它们会被阻止?现在不使用sync方法,如果我像下面这样将hashmap更改为ConcurrentHashMap,会有什么行为?publicvoidmethod1(){myConcurrentHashMap.clear();//p