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,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
113 5
|
3月前
|
Java 调度
Java 线程同步的四种方式,最全详解,建议收藏!
本文详细解析了Java线程同步的四种方式:synchronized关键字、ReentrantLock、原子变量和ThreadLocal,通过实例代码和对比分析,帮助你深入理解线程同步机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 线程同步的四种方式,最全详解,建议收藏!
|
4月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
4月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
82 1
|
4月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
151 3
|
6月前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
97 5
|
6月前
|
Java 程序员
从0到1,手把手教你玩转Java多线程同步!
从0到1,手把手教你玩转Java多线程同步!
58 3
|
6月前
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -&gt; expression` 或 `(parameters) -&gt; { statements; }`。
46 1
|
6月前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
119 1
|
6月前
|
存储 算法 Java
Java 中的同步集合和并发集合
【8月更文挑战第22天】
62 5