Java 同步代码块的疑问

简介:

ThreadTest.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package  main;
 
import  java.util.concurrent.atomic.AtomicLong;
import  net.jcip.annotations.GuardedBy;
import  net.jcip.annotations.ThreadSafe;
 
@ThreadSafe
public  class  ThreadTest {
     private  long  hits1;
     @GuardedBy ( "this" )
     private  long  hits2;
 
     private  final  AtomicLong count =  new  AtomicLong( 0 );
 
     public  long  getCounts() {
 
         return  count.get();
     }
 
     public  synchronized  long  getHits1() {
         return  hits1;
     }
 
     public  synchronized  long  getHits2() {
         return  hits2;
     }
 
     public  synchronized  void  IncreaseHits1() {
         ++hits1;
     }
 
     public  void  service( int  n)  throws  InterruptedException {
         for  ( int  i =  1 ; i <= n; i++) {
             new  Thread( new  Runnable() {
 
                 @Override
                 public  void  run() {
                     // TODO Auto-generated method stub
                     synchronized  ( this ) {
                         ++hits2;
                     }
                     IncreaseHits1();
                     count.incrementAndGet();
 
                 }
 
             }).start();
         }
         System.err.println( "All Threads running!" );
         Thread.currentThread().sleep( 2000 );
         System.out.println( "hits1:"  + getHits1() +  "   hits2:"  + getHits2()
                 "   AtomicLong:"  + getCounts());
     }
 
}


main.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  main;
 
public  class  main {
 
     public  static  void  main(String[] args)  throws  InterruptedException {
 
         ThreadTest threadTest =  new  ThreadTest();
         for  ( int  i =  0 ; i <  1000 ; i++) {
             threadTest.service( 10000 );
         }
 
     }
 
}

请问,hits2是否最后的结果是否正确,是否线程安全?

当累计跑了185次service后,控制台输出为:

wKioL1N96FXDPN20AAF1dq37do0409.jpg


1
2
3
synchronized  ( this ) {
     ++hits2;
}

看输出结果的话,上面这这一小段同步块代码貌似并非是线程安全的。不了解java注解有什么作用如@ThreadSafe和@GuardedBy("this"),应该不会对运行结果造成什么影响吧。










本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1415563,如需转载请自行联系原作者
目录
相关文章
|
7天前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
【6月更文挑战第20天】在Java多线程编程中,`synchronized`和`Lock`是两种关键的同步机制。`synchronized`作为内置关键字提供基础同步,简单但可能不够灵活;而`Lock`接口自Java 5引入,提供更复杂的控制和优化性能的选项。在低竞争场景下,`synchronized`性能可能更好,但在高并发或需要精细控制时,`Lock`(如`ReentrantLock`)更具优势。选择哪种取决于具体需求和场景,理解两者机制至关重要。
|
2天前
|
存储 安全 Java
Java中的线程安全与同步技术
Java中的线程安全与同步技术
|
7天前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
【6月更文挑战第20天】Java多线程同步始于`synchronized`关键字,保证单线程访问共享资源,但为应对复杂场景,`Lock`接口(如`ReentrantLock`)提供了更细粒度控制,包括可重入、公平性及中断等待。通过实战比较两者在高并发下的性能,了解其应用场景。不断学习如`Semaphore`等工具并实践,能提升多线程编程能力。从同步起点到专家之路,每次实战都是进步的阶梯。
|
7天前
|
Java 程序员
从0到1,手把手教你玩转Java多线程同步!
【6月更文挑战第20天】从0到1学Java多线程同步:理解线程同步关键,掌握`synchronized`用法,探索`Lock`接口,实战演练并进阶学习锁升级、`Condition`及死锁预防,成为多线程大师!
|
1天前
|
存储 安全 搜索推荐
深入剖析Java中的CountDownLatch:同步协作的利器
深入剖析Java中的CountDownLatch:同步协作的利器
9 5
|
16天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
32 2
|
21天前
|
安全 Java 开发者
Java并发编程的艺术:解锁多线程同步的奥秘
本文将深入探讨Java并发编程的核心概念,揭示多线程环境下同步机制的工作原理与实践技巧。我们将从基础的synchronized关键字讲起,逐步过渡到高级的Lock接口和并发工具类,最后通过实例分析来加深理解。文章不仅旨在为初学者提供一个清晰的并发编程入门指南,同时也希望能够帮助有一定经验的开发者巩固和提升他们的并发处理能力。
|
21天前
|
Java 调度
Java的非阻塞同步
Java的非阻塞同步
15 1
|
15小时前
|
Java
Java中代码块区别及代码示例
Java中代码块区别及代码示例
|
2天前
|
Java 机器人 程序员
如何在Java中进行并发编程:锁与同步机制
如何在Java中进行并发编程:锁与同步机制