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. MapReduce编程:单词去重

    编程实现单词去重要用到NullWritable类型. NullWritable: NullWritable 是一种特殊的Writable 类型,由于它的序列化是零长度的,所以没有字节被写入流或从流中读 ...

  2. 微信小程序开发学习记录

    两天撸了一遍小程序的文档,跟网页相似,个人感觉是简化版.但是因为开放了很多微信自带的接口又使得部分功能开发起来相对方便 思维导图如下: 目前我的理解大概是这么个逻辑,以后深入学习后可能会有更改 跟着大 ...

  3. 浅谈StringBuffer

    StringBuffer,由名字可以看出,是一个String的缓冲区,也就是说一个类似于String的字符串缓冲区,和String不同的是,它可以被修改,而且是线程安全的.StringBuffer在任 ...

  4. guxh的python笔记十:包和模块

    1,包和模块 包package:本质就是一个文件夹/目录,必须带一个__init.__.py的文件 模块module:.py结尾的python文件 2,导入方法 import pandas, coll ...

  5. Luffy之购物车页面搭建

    前面已经将一些课程加入购物车中,并保存到了后端的redis数据库中,此时做购物车页面时,我们需要将在前端向后端发送请求,用来获取数据数据 购物车页面 1.首先后端要将数据构建好,后端视图函数如下代码: ...

  6. 『TensorFlow』分类问题与两种交叉熵

    关于categorical cross entropy 和 binary cross entropy的比较,差异一般体现在不同的分类(二分类.多分类等)任务目标,可以参考文章keras中两种交叉熵损失 ...

  7. Alpha阶段敏捷冲刺

    博客连链接集合 第一篇:http://www.cnblogs.com/just-let-it-go/p/8875433.html 第二篇:http://www.cnblogs.com/just-let ...

  8. 记一下JavaScript的几种排序算法

    零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http ...

  9. C++解析九-数据抽象

    数据抽象 数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节.数据抽象是一种依赖于接口和实现分离的编程(设计)技术.让我们举一个现实生活中的真实例子,比如一台电 ...

  10. VSTO:使用C#开发Excel、Word【14】

    操作workbooks集合可从Application对象的Workbooks属性中获取的Workbooks集合包含当前在应用程序中打开的Workbook对象的集合. 它还具有用于管理开放工作簿,创建新 ...