public class TestRaceCondition implements Runnable{

    public static int counter = 0;

    public static void main(String[] args) {

        List<Thread> threads = new ArrayList<>();
//產生threads,加入ArrayList
for( int i=0 ; i < 10 ; i++) {
TestRaceCondition runnable = new TestRaceCondition();
Thread t1 = new Thread(runnable,"T"+i);
threads.add(t1);
}
//一起發動所有的thread
for (Thread thread : threads) {
thread.start();
}
try {
//main thread 等待所有執行緒結束
for (Thread thread : threads) {
thread.join();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
//印出最後的值
System.out.println("finally counter = "+counter); } @Override
public void run() {
for ( int i= 0 ; i < 1000 ;i ++){
incrementCounter();
}
} public static void incrementCounter(){
counter = counter + 1;
} }

[原始程式架構]

設立10個執行序塞入List中,再同時執行程序,各自生成一個Runnable的物件,執行run(),再incrementCounter()

此處會有共搶的Race Condtion發生,避免此狀況,可使用synchronized管控程序

(%所有synchronized標的都需唯一)

1. static 方法 加上 synchronized

所有用到這個方法的都是受到管控的,鎖頭為類別自身(TestRaceCondition.class)

 public static synchronized void incrementCounter(){
counter = counter + 1;
}

2.方法中設立專鎖物件控管執行方法

    //設立專鎖物件
public final static Object locker = new Object(); @Override
public void run() {
for ( int i= 0 ; i < 1000 ;i ++){
synchronized (TestRaceCondition.locker)
incrementCounter();
}
}

3. 一般方法中加上 synchronized

所有用到這個方法的都是受到管控的,鎖頭為自身物件()

但此處每個Thread都各自生成物件執行程式,所以不具管控性,需調整程式為 => 生成一個執行物件,所有程序都使用同一物件

public static void main(String[] args) {
.
.
List<Thread> threads = new ArrayList<>();
TestRaceCondition runnable = new TestRaceCondition();
for( int i=0 ; i < 10 ; i++) {
Thread t1 = new Thread(runnable,"T"+i);
threads.add(t1);
.
. @Override
public synchronized void run() {
for ( int i= 0 ; i < 1000 ;i ++){
incrementCounter();
}
}

[Java] Thread -- 避免Race Condition (Synchronized)的更多相关文章

  1. java 多线程 Thread 锁ReentrantLock;Condition等待与通知;公平锁

    1,介绍: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;   在JA ...

  2. Java Thread系列(五)synchronized

    Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...

  3. Java并发控制:ReentrantLock Condition使用详解

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另外一个 ...

  4. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  5. 【多线程同步案例】Race Condition引起的性能问题

    Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题.特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性.为了解决这个问题,通常来说需 ...

  6. Java中的Lock与synchronized

    并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...

  7. java多线程(3)---synchronized、Lock

    synchronized.Lock 一.概述 1.出现线程不安全的原因是什么? 如果我们创建的多个线程,存在着共享数据,那么就有可能出现线程的安全问题:当其中一个线程操作共享数据时,还未操作完成,另外 ...

  8. Java同步锁——lock与synchronized 的区别【转】

    在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...

  9. 三个实例演示 Java Thread Dump 日志分析

    原文地址: http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html jstack Dump 日志文件中的线程 ...

随机推荐

  1. TCP协议三次握手、四次挥手

    TCP的概述 TCP 把连接作为最基本的对象,每一条 TCP 连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到 IP 地址即构成了套接字,例如,若 IP 地址为 192 ...

  2. pm2 日常使用

    1. pm2 是什么? 日常开发中需要启动一个node项目,需要用npm run …,,如果终端被关掉,程序也就自动停止,有时候几个项目一起跑起来,好几个终端开着,个人不太喜欢,有一神器可以解决:pm ...

  3. 读写方式 r , r+ , w , w+ , a , a+

    r只读,r+读写,不创建:r+:可读可写,若文件不存在,报错 w如果文件已经存在,则不替换: w 就是打开文件,文件如果不存在,就会新建一个文件: w+: 可读可写,若文件不存在,创建 信息来源:ht ...

  4. 正则表达式中pw、IDCard和EM匹配

    1密码强度正则 //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])( ...

  5. Loadrunner常见的乱码问题

    1.录制的脚本出现了乱码 录制的时候出现乱码,如果不影响回放,我们可以不管它,如果影响回放结果,我们可以使用以下方法解决:     1)更改录制选项         选择菜单栏Tools---> ...

  6. vue 打开新页面

    <router-link tag="a" target="_blank" :to="{path:'/system/detail?id=' + s ...

  7. HTML5⑥

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. python变量传递

    python变量传递 数值 代码 num_1 = 123 num_2 = num_1 # 改变num_2值前 print 'num_1 = {0}, num_2 = {1}'.format(num_1 ...

  9. ArcGIS 按多边形区域统计栅格影像的一些信息

    在使用ArcGIS对栅格影像进行分析时,难免要进行一些统计类的分析.如统计框选区域的像素的个数,面积.均值等内容. 下面给出使用“Spatial Analyst Tools -- > Zonal ...

  10. Oracle 导出的表不全,以及数据库版本不同导入报错

    公司有两个环境下的数据库,版本不同,一个是11g r2,另一个是10g r2 首先在11g r2下用exp导出数据库备份文件,发现部分表缺失. 原来这部分表是空的,11G中新特性,当表无数据时,不分配 ...