文档章节

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

勇恒
 勇恒
发布于 2017/07/11 16:34
字数 200
阅读 25
收藏 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
码字总数 58838
作品 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并发】—– 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑...

chenssy
07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

申请Let's Encrypt永久免费SSL证书

环境安装 1、安装git yum install git-core 2、安装python 系统自带 不用安装 只要版本大于2.7即可。 获取Let's Encrypt免费SSL证书 先停止nginx 在阿里云安全组里加入 443端口的入规则 git ...

HGMrWang
36分钟前
1
0
如何使用playframework进行更好的开发

1: 自定义基类Controller 相信刚开始使用Play的人写的Controller 都继承于 play.mvc.Controller , 但这并不是一个很好的选择,自建基类Controller可以扩展更多的功能。 1.1 验证功能。 后台...

tuerqidi
40分钟前
4
0
解决ubuntu下root用户 不能ftp登陆的问题

解决ubuntu下root用户 不能ftp登陆的问题 一般情况下,由于种种原因ftp是不让root用户远程登陆,但只要你修改以个文件就可以登陆了. 注释掉 /etc/ftpusers 中的root即可 (最后重启vsftpd serv...

15834278076
52分钟前
0
0
《JavaScript高级程序设计(第3版)》阅读笔记

第6章 面向对象的程序设计 6.2 创建对象 6.2.1 工厂模式 JavaScript创建对象(一)—— 工厂模式 6.2.2 构造函数模式 JavaScript创建对象(二)——构造函数模式 6.2.3 原型模式 JavaScript...

Bob2100
57分钟前
1
0
Windows小技巧 – Win+R提高Windows使用效率

追求效率的朋友都需要一款顺手的快速启动工具,Win 平台上有键盘流的RunZ、Listary、ALTRun、Launchy、Wox 和图标流的 Fences、Rolan、 WinLaunch 等,而 Mac 上也有 Alfred、Spotlight。 而...

QQZZFT
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部