文档章节

java中的锁、线程池及static/volatile一起的demo

勇恒
 勇恒
发布于 2017/07/11 16:34
字数 200
阅读 20
收藏 0

直接上代码:

一个静态变量B,一个静态方法addB,调用线程池循环增加B,如果不加synchronized关键字给addB方法,则会出现不等于1000的问题:

即使此时为B添加volatile,还是不等于正确答案1000.

 

添加synchronized后,才是正确答案1000;

 


package org.braven.servlet;

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

public class App {

    static int B = 0;
//static volatile int B = 0;


    static synchronized void addB() {
        try {
            Thread.sleep(1);
        } catch (Exception e) {
            // TODO: handle exception
        }
        B++;
    }


    public static void main(String[] args) throws InterruptedException {

        /*for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {

                public void run() {
                    addB();
                }
            }).start();
        }*/
        ExecutorService pool = Executors.newFixedThreadPool(20);
        for (int i = 0; i < 1000; i++) {
            pool.submit(new Runnable() {

                public void run() {
                    addB();
                }
            });
        }

        Thread.sleep(2000);
        System.out.println("B最终等于:" + B);

        App app1 = new App();
        App app2 = new App();
        System.out.println(app1.B);
        System.out.println(app2.B);
        App.addB();
        System.out.println(app1.B);
        System.out.println(app2.B);
    }
}

 

© 著作权归作者所有

共有 人打赏支持
勇恒
粉丝 2
博文 109
码字总数 57634
作品 0
杭州
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
Java语言学习(十二):多线程

Java中给多线程编程提供了内置的支持,多线程是多任务的一种特别形式,它使用了更小的资源开销。这里需要知道两个术语及其关系:进程和线程。 进程:进程是系统进行资源分配和调度的一个独立...

海岸线的曙光
07/19
0
0
Java线程框架_Executor

Executor 框架是 juc 里提供的线程池的实现。前两天看了下 Executor 框架的一些源码,做个简单的总结。 线程池大概的思路是维护一个的线程池用于执行提交的任务。我理解池的技术的主要意义有...

天呀鲁哇
2015/02/05
0
0
Java并发学习之Volatile及内存模型探究

volatile工作原理 java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言提供了volatile,在某些情况下比锁更加方便...

小灰灰Blog
2017/11/02
0
0
【转】Java线程面试题Top50

目录(?)[-] 50道Java线程面试题 1 什么是线程 2 线程和进程有什么区别 3 如何在Java中实现线程 4 用Runnable还是Thread 6 Thread 类中的start 和 run 方法有什么区别 7 Java中Runnable和Cal...

gehui
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
3
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部