java并发编程及解决方案(一)

本文介绍了并发和高并发的概念,通过一个高并发计数功能的模拟,探讨了线程不安全的问题。文章详细分析了线程安全的三个方面——原子性、可见性和有序性,并举例说明了Atomic包、synchronized和volatile在确保线程安全方面的应用,指出volatile只能保证可见性而无法保证原子性。
摘要由CSDN通过智能技术生成

并发和高并发概念

在讲高并发示例之前,先来普及一下并发和高并发的概念,磨刀不误砍柴工,只有了解了概念,才能更好的理解高并发发生的前因后果,而后才能解决问题

并发:同时拥有两个或多个线程,如果程序在单核处理器上运行,多个线程将交替换入或换出内存,这些线程在我们肉眼中它们是同时“存在”的(其实是cpu运行速度过快而导致我们肉眼看不到,误以为两个或多个以上的线程”同时“”运行),如果两个或多个线程运行在多核处理器上,此时程序中的每个线程都将分配到某一个处理器核上,那么两个或者多个线程是可以真正同时存在,两个或多个线程能够同时运行,我们就称为并发

通俗来讲,就是多个线程同时操作相同的资源

高并发:服务器同时访问计算机资源,比如天猫淘宝这些网站,时时刻刻都在发生高并发,如果处理不当,会导致服务器发生宕机,内存溢出等异常。。。。

高并发模拟(实现一个计数功能)

使用线程池和信号量来模拟一个高并发的计数功能,对线程池和信号量不明白的自行google

package com.mmall.concurrency.example.count;

import com.mmall.concurrency.annoations.NotThreadSafe;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class CountExample1 {
    //请求总数
    public static int clientTotal = 5000;

    //同时并发执行的线程数
    public static int threadTotal = 200;

    public static int count = 0;

    public  static void main(String[] args) throws Exception{
        //定义一个线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        //定义一个信号量,信号量的作用是控制线程对资源的访问
        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);

        for(int i=0;i<clientTotal;i++){
            executorService.execute(()->{
                try {
                    semaphore.acquire();
                    add();
                    semaphore.release();
                }catch (Exception e){

                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println("count:"+count);
    }
    public static vo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值