博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
入门Java多线程1
阅读量:6325 次
发布时间:2019-06-22

本文共 1466 字,大约阅读时间需要 4 分钟。

一个例子:

public class Counter {         public static int count = 0;     public synchronized static void inc() {        count++;    }     public static void main(String[] args) {         for (int i = 0; i < 100; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    Counter.inc();                }            }).start();        }    while(Thread.activeCount() > 1){        Thread.yield();    }        System.out.println("运行结果:Counter.count=" + Counter.count);    }}

使用线程:

1.新建自定义类,继承接口Runnable,并实现方法run()。
2.实例化,作为参数传给thread(),调用thread的start方法,运行线程。该线程就会运行run()的代码。

本来,main方法执行过程便是一个线程,就好比一个人A在干活。新建一个线程,就好比又召集了一个人来同时干活。上面的例子中,这新来的人——新建的线程——将会和A一起同时地干活。

所以,如果不在main线程里判断其他100个线程是否允许完毕的话,A(main函数所在线程)可能将会比其他人有些人干的更快,那么——main函数的线程先于其他线程跑完,导致打印的结果不是最终100个线程跑完的结果。

synchronized关键字声明了该方法为同步方法。意即,同时只允许一个线程运行这个方法。前面我们说过,新建并启动了100个线程,这100个人都准备开始干活,但是带有synchronized关键字的方法只允许同时一个人使用。也就是说这100个人需要排队等待,先来后到。

为什么要同步,先来后到呢?

这里就存在内存使用的问题。

每一个线程在使用实例变量的时候,会复制一份副本到自己的栈内存中(每个线程独自享有)。倘若实例变量为5,现有两个线程同时复制了5到自己的线程内存。他们各自做加1操作,随后线程A将结果6,写回到主内存中;随后线程B也将6写回到主内存中。
但是我们的初衷可能是需要该变量作为计数器,反映所做操作的次数,但是这里两个线程共做了2次操作,变量的值却只加了1。
这个时候,使用synchronized,方法就会“同步”。一个线程做完,并将数据刷新回主内存了,下一个线程才会启动。
就好比,房子里有一个房间,想进入的人必须拿到门口的桌子上放着的一把钥匙,没有钥匙的人只可在门外等候。只有等这个人做完所有工作,并且把钥匙还回门口的桌子,下一个人才能从桌子拿到钥匙,进入房间。

volatile

Java还提供了关键字volatile。声明了volatile的变量在被赋值之后,线程会立刻将值写回主内存;在读取变量时,线程会到主内存去读取变量的最新值。说白了,它增加了线程与主内存的通信,以期望解决多线程写数据的同步问题。

但这也并不一定能保证上述计数器的问题。

转载地址:http://jomaa.baihongyu.com/

你可能感兴趣的文章
《代码之殇》(原书第2版)——第1章 项目管理失当
查看>>
微软准备再次裁员2850人 一年之内完成
查看>>
Cignal半年报称云公司和中国运营商采购撑起光设备市场增长
查看>>
《MonoTouch开发实践指南》一3.5 实现自定义UIView
查看>>
内蒙古国税局持续提升大数据应用水平
查看>>
物流软件领航者为何选择易维帮助台提升客服服务
查看>>
荔波打造黔南首座智慧城市
查看>>
楼宇对讲赶上智慧城市热潮 或迎来行业春天
查看>>
互动电视产业迎来专属云服务
查看>>
自动化技术的引入为数据中心运营带来高效
查看>>
纳德拉透露:微软将推出“终极移动设备”
查看>>
联合国发布报告:中国成全球第一大互联网市场
查看>>
大数据管理全面开花,覆盖学校“医住修浴”
查看>>
华为蔡英华:渠道建设要做好三件事
查看>>
2017年全球WDM市场将达120亿美元
查看>>
清源科技为菲律宾最大商业屋顶光伏电站提供光伏支架
查看>>
阿里巴巴如何玩转大数据
查看>>
苹果高管简谈外部GPU技术 这说明了什么?
查看>>
Windows 10增速放缓 Windows 7份额无法撼动
查看>>
预计我们两年内将迎来18 TB磁盘驱动器
查看>>