使用原子类或synchronized(没用Lock)解决阐述多线程所遇到线程安全问题和解决方案
例子题目:
创建10个线程,每个线程执行10000次加1,输出总和
正常结果100000 但是如果出现线程不安全会低于100000
import java.util.concurrent.CountDownLatch; /**
* 解决多线程并发遇到的问题 例如:线程安全 主线程等待子线程处理完在执行
*
* @author wangbing
* @since 17 七月 2018
*/
public class TreadSafe { //原子操作类
//static volatile AtomicInteger count = new AtomicInteger(0);
static int count = 0;
static Object common = new Object();
//定义CountDownLatch
static CountDownLatch countDownLatch = new CountDownLatch(10); public static void main(String[] args) throws InterruptedException { Task task = new Task();//这句代码位置很重要 这是实例一次
// 下面创建10个线程 参数为同一个实例即上面,因同一个实例(即多个线程共享一个锁)
// 所以在实例的run上加synchronized可以保证线程安全
for (int i = 0; i < 10; i++) {
//Task task = new Task(); //若实例位置在这里,那么每次创建新实例并传入到新线程中,
//导致10个线程的参数并非同一实例而是10个不同的实例,那么实例run上加synchronized就无效了,
//因为锁绑定了10个线程,共10个锁,并没有共享一个锁。 但若想实现同步可以锁住一个共享对象如run中注释掉部分
Thread thread = new Thread(task);
thread.start(); }
countDownLatch.await();
System.out.println(" 等待子线程结束结果为: " + count); } static class Task implements Runnable {
@Override
public synchronized void run() { for (int i = 0; i < 10000; i++) {
// count.addAndGet(1); //原子加1
/*synchronized (common) {
count++; //锁住common即锁住多个线程共享唯一的对象,这就可以实现线程安全,解决上面实例位置的不同导致锁错对象
}*/
count++;
}
countDownLatch.countDown();
}
}
}
注释上面写了 解决方案!!
使用原子类或synchronized(没用Lock)解决阐述多线程所遇到线程安全问题和解决方案的更多相关文章
- CAS 算法与 Java 原子类
乐观锁 一般而言,在并发情况下我们必须通过一定的手段来保证数据的准确性,如果没有做好并发控制,就可能导致脏读.幻读和不可重复度等一系列问题.乐观锁是人们为了应付并发问题而提出的一种思想,具体的实现则有 ...
- Java 原子类 java.util.concurrent.atomic
Java 原子类 java.util.concurrent.atomic 1.i++为什么是非线程安全的 i++其实是分为3个步骤:获取i的值, 把i+1, 把i+1的结果赋给i 如果多线程执行i++ ...
- Java并发机制(2)--synchronized与Lock
本内容整理自:博客园-海 子-java并发编程系列-http://www.cnblogs.com/dolphin0520/category/602384.html 1.基础: 1.什么时候出现线程安全 ...
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- 使用AtomicInteger原子类代替i++线程安全操作
Java中自增自减操作不具原子性,在多线程环境下是线程不安全的,可以使用使用AtomicInteger原子类代替i++,i--操作完成多线程线程安全操作. 下面是等于i++多线程的自增操作代码: pu ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)
还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...
- 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理
(1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...
- 【漫画】CAS原理分析!无锁原子类也能解决并发问题!
本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...
随机推荐
- gaea-basic-components 知识点
github:https://github.com/ascoders/gaea-basic-components
- 微信小程序学习之for循环
一.使用自定义创建的json数据 1. 创建微信小程序项目后 在wxml文件中增加for循环 <block wx:for="{{posts_key}}" wx:for-ite ...
- Mongodb主从复制 及 副本集+分片集群梳理
转载努力哥原文,原文连接https://www.cnblogs.com/nulige/p/7613721.html 介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 ...
- Feign 请求拦截器和日志
Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参 ...
- 在没有go-pear.bat的php中安装pear
因为需要安装phpunit,要先装pear,网上的教程大多数是以双击go-pear.bat开始,但是我安装的php文件夹里压根没有这个文件.经过几次搜索之后终于找到了办法.解决步骤如下:1.下载下面连 ...
- ML: 降维算法-概述
机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达, y是数据点映射后的低维向量 ...
- hyperledger fabric各类节点及其故障分析 摘自https://www.cnblogs.com/preminem/p/8729781.html
hyperledger fabric各类节点及其故障分析 1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端 ...
- TStringList的用法
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. TStringList 常用方法与属性: var List: TStringList; i: Integer; begin ...
- PHP_EOL DIRECTORY_SEPARATOR
换行符 PHP_EOL unix系列用 \n windows系列用 \r\n mac用 \r PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 路径上的斜杠 DIRECTORY_ ...
- node.js 学习的一个链接
Node.js简介 点击查看 狼叔 的