java SE学习之线程同步(详细介绍)
java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:
当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个程序是该如何执行?
也就是先访问这个变量还是先修改这个变量.
在学习线程的这段时间里,我也一直被这个问题所困扰!但是今天终于算是搞明白了.
于是将这些好的列子一一列举出来,分享一下.
(1)什么是线程同步 ?
线程同步是所有的线程同时段同时运行吗? 回答是: “当然不是”,
那么什么是线程同步勒? 线程同步就是若干个线程都需要使用一个synchronized(同步的意思)修饰的方法,即程序中的若干个
线程都需要使用一个方法,而这个方法用synchronized给与了修饰。同时多个线程调用synchronized方法必须要遵守同步机制(引自《java 2 使用教程》)
而所说的同步机制其实就是: 当一个线程在使用synchronized方法时,其他线程得等到这个使用完这个synchronized方法时才可以去使用。好比一个队列,要等到前面一个完成了,下面一个才可以继续的意思..可见线程同步,并非我们所的所有线程同时段执行同一个事件、
(2)举列子: 在一个工地上,有两个人分别为甲和乙 ,甲负责搬砖,乙负责砌墙。甲要保证乙时刻都有砖可以砌墙.......
(每一个程序员,都是上辈子折了翅膀的天使!,搬砖的也是,砌砖的也是,呜呜呜呜)。
//package DEMO; public class chenxiyuan { public static void main(String args [])
{
WorkPlace worker ;
worker = new WorkPlace();
worker.setBrick(30); //假设刚开始的时候有30块砖
Thread jiawork ,yiwork;
jiawork =new Thread(worker); // 组合
yiwork = new Thread(worker);
jiawork.setName("搬砖工");
jiawork.start();
yiwork.setName("砌砖工");
yiwork.start();
}
} class WorkPlace implements Runnable
{
int BrickNumber=0; //码放的砖头的数目
public void setBrick(int bricks)
{
BrickNumber=bricks;
}
public void run() {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName(); if(name.equals("搬砖工")) ;
else
;
}
//使用synchronized修饰方法
public synchronized void WORK(int bricks)
{
String name = Thread.currentThread().getName();
if(name.equals("搬砖工"))
{
while(BrickNumber<100&&BrickNumber>=0)
{
System.out.println("我呵了个呵 ,距离休息还差: "+(100- BrickNumber)+"块砖 !");
System.out.println("奶奶的,工头不再,赶紧头下懒..... (*^__^*) !");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} BrickNumber+=bricks;
}
System.out.println("哇咔咔,终于忙完了!");
}
else
{
System.out.println("------又要开始砌砖了!呜 呜 呜 -------");
while(BrickNumber>0)
{
System.out.println("距离完工还有: "+BrickNumber+" 块砖没搞完");
BrickNumber-=bricks;
}
System.out.println("忙完咯! 可以去领工资啦! 欧耶.....!");
}
}
}
效果图:
如果我们去掉synchronized修饰的又会是什么情况勒? :-)
public class chenxiyuan { public static void main(String args [])
{
WorkPlace worker ;
worker = new WorkPlace();
worker.setBrick(30); //假设刚开始的时候有30块砖
Thread jiawork ,yiwork;
jiawork =new Thread(worker); // 组合
yiwork = new Thread(worker);
jiawork.setName("搬砖工");
jiawork.start();
yiwork.setName("砌砖工");
yiwork.start();
}
} class WorkPlace implements Runnable
{
int BrickNumber=0; //码放的砖头的数目
public void setBrick(int bricks)
{
BrickNumber=bricks;
}
public void run() {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName(); if(name.equals("搬砖工")) WORK(20);
else WORK(30) ;
}
//使用synchronized修饰方法
public void WORK(int bricks)
{
String name = Thread.currentThread().getName();
if(name.equals("搬砖工"))
{
while(BrickNumber<100&&BrickNumber>=0)
{
System.out.println("我呵了个呵 ,距离休息还差: "+(100- BrickNumber)+"块砖 !");
System.out.println("奶奶的,工头不再,赶紧头下懒..... (*^__^*) !");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} BrickNumber+=bricks;
}
System.out.println("哇咔咔,终于忙完了!");
}
else
{
System.out.println("------又要开始砌砖了!呜 呜 呜 -------");
while(BrickNumber>0)
{
System.out.println("距离完工还有: "+BrickNumber+" 块砖没搞完");
BrickNumber-=bricks;
}
System.out.println("忙完咯! 可以去领工资啦! 欧耶.....!");
}
}
}
效果图:
你会发现,第一个同步线程和多线程的差异原来是,上面讲的等一个人全部做完,才轮到下一个人做。
——--------------------------------——参考文献——————————————————————————————————————————
****** 《java 2 程序设计》 ----(第四版)
****** <<csdn网站>>
------------------作者 龚细军
java SE学习之线程同步(详细介绍)的更多相关文章
- Java多线程学习总结--线程同步(2)
线程同步是为了让多个线程在共享数据时,保持数据的一致性.举个例子,有两个人同时取钱,假设用户账户余额是1000,第一个用户取钱800,在第一个用户取钱的同时,第二个用户取钱600.银行规定,用户不允许 ...
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- 转:Java多线程学习(总结很详细!!!)
Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...
- 【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- [转]Java多线程学习(总结很详细!!!)
Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
概要 前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
- 【转】 Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
随机推荐
- GoAccess日志分析工具使用文档
----Sevck 2016/3/4 17:24:13 #1软件说明: GoAccess是一款开源.实时,运行在命令行终端下的web日志分析工具.该工具提供快速.多样的HTTP状态统计,可以令管理员不 ...
- C# 导出数据至 CSV
有时候将Excel的数据另存到csv文件会出现csv格式错误,以下示例实现将DataTable里面的数据直接保存到csv文件. System.Web.HttpRuntime.Cache["v ...
- Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理
上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...
- FLASH CC 2015 CANVAS (三) flash中写JS调用html中JS的函数,变量
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 首先我们在HTML里的JS里面添加几行代码 我们在FLASH中新建一个元件,并拖入到舞台,在属性面板 ...
- SAP 关于标准成本、计划成本、目标成本、实际成本
SAP 关于标准成本.计划成本.目标成本.实际成本 <A style="MARGIN-RIGHT: 10px" target=_blank data-ext="{v ...
- JavaSE复习_9 集合框架复习
△列表迭代器也是不支持在迭代的时候添加元素的,只是列表迭代器自己定义了增删的方法而已.迭代器可以看成实在两个元素之间的指针,每当调用next就跳过一个元素并返回刚刚跳过的元素. △HashTable不 ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- hdu 4414 Finding crosses
题目链接:hdu 4414 其实是一道简单的字符型水题,不涉及任何算法,可比赛时却没能做出来,这几天的状态都差到家了... 题目大意是求有多少个满足条件的十字架,十字架的边不能有分叉路口,所以枚举每个 ...
- PKCS #1 RSA Encryption Version 1.5
PKCS #1 RSA Encryption Version 1.5 在进行RSA运算时需要将源数据D转化为Encryption block(EB).其中pkcs1padding V1.5的填充模式 ...
- HTML CSS 常用英语单词
head 头部 body 身体 title 标题 table表格 list 列表 i ...