Thread同步
今天本人给大家讲解一下多线程的线程同步,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!!
开始说线程同步前先来个小案例:
案例一启:所有的类都在Demo01中,除了主类Demo01外,其它的是内部类
public class Demo01 {
public static void main(String[] args){
//创建公司类实例对象
Company company = new Company();
//创建部门类实例对象
Departement department = new Departement(company);
//创建线程对象
Thread thread01 = new Thread(department,"木木01");
Thread thread02 = new Thread(department,"木木02");
Thread thread03 = new Thread(department,"木木03");
//开启线程
thread01.start();
thread02.start();
thread03.start();
}
}
/**
* 公司类
*/
class Company{
public int companyCount=200; //公司总人数
public Company() {
}
public Company(int companyCount) {
this.companyCount = companyCount;
}
private static final Object obj = new Object();
//增加员工人数的方法
public void withdraw(){
synchronized (obj){
System.out.println("当前线程的名称:"+Thread.currentThread().getName()+"\t公司现有员工:"+companyCount+"人");
//增加员工人数
companyCount+=5;
System.out.println("当前线程的名称:"+Thread.currentThread().getName()+"\t公司增加5名员工后,现有员工:"+companyCount+"人\n");
}
}
}
/**
* 部门类
*/
class Departement extends Company implements Runnable{
public Departement(){
}
public Departement(Company company){
super();
}
public void run(){
super.withdraw();
}
}
运行结果:

看到运行结果,会不会有些很惊讶,明明在案例中我们写的方法是这样的

可是运行的结果却和我们想象中的不一致。
首先我们要知道的一点是,我们现在使用的是多线程的技术了,而启动多线程了它的执行的方式是根据抢占cpu的执行权时间片来进行的,当我们在进行线程thread01名称为木木01的时候,我们的线程cpu的时间片只够它执行withdraw()方法中的第一行和第二行代码,当它要执行后面的代码时,它的时间片没有了,在后面被thread02和thread03将cpu的执行权抢占了过来去执行了,这样导致了我们的方法结果有了不一致的现象。从而我们将提出了解决方案进行线程同步,来解决这个问题。
线程同步:
当多个线程在同一时间操作堆区或者方法区的某个数据时,有时会出现数据不一致的情况,如刚刚的案例所示。这种问题我们称它为线程安全问题。而一般线程同步多用于对一些敏感的数据不能同时访问时,而使用它。
线程同步语法:
在方法区中添加;
synchronized(同步锁对象){
}
线程同步的机制:
任意对象都可以作为锁对象,但每个对象只能有一个内置锁。线程同步代码块必须需要锁对象,某一个时刻锁对象只能被一个线程持有,当前的锁对象被占用时,它的状态会变成BLOCKED阻塞状态,而它的结束时机是在同步代码块中的代码全部执行完成后才会释放锁对象。
案例启:
修改的代码如下:

运行结果:

案例二启:也可以将synchronized修饰实例方法,把整个代码块变成同步代码块,不用在类中定义一个常量的锁对象
修改代码如下:

运行结果:同案例一的结果一致

现在的数据结果都没有问题了,是正确的输出了出来!!!
创建Thread同步讲解完毕,又不懂或者不理解的可以在评论区给本人留言。
Thread同步的更多相关文章
- delphi.thread.同步
注意:此文只是讲线程间的同步,其它同步不涉及. 线程同步是个好话题,因为写线程经常会遇到,所以就写写自己知道的东西. D里面,同步(特指线程同步)从线程的角度来分,有几种情况: 1:主线程与工作线程的 ...
- Thread 同步线程(打印机同步)
1.首先创建一个打印机对象 package cn.b.happy; public class Printer { Object o =new Object(); public void print() ...
- Java 多线程(Thread) 同步(synchronized) 以及 wait, notify 相关 [实例介绍]
场景描述 有一家很大的商场,在某市有几个商品配送中心,并有几家分店,这家商场经营很多的商品,平时运营情况是这样的: 根据各分店的商品销售情况,给分店配送相应需求量的商品:并上架到分店指让的位置,供客户 ...
- process thread Fiber(linux)
http://blog.chinaunix.net/uid-21084809-id-2215376.html Processes, kernel threads, user threads, and ...
- SWT中的多线程(Invalid thread access)
最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...
- 使用HTTP的同步方式还是异步方式?
同步与异步 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完 ...
- Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
两个线程执行任务有同步和异步之分,看了Quora上的一些问答有了更深的认识. When you execute something synchronously, you wait for it to ...
- ThreadLocal并不是一个Thread
ThreadLocal是什么? 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁 ...
- 16.同步类容器Collections.synchronized
voctor动态数组.同步类容器,底层实现基于:Collections.synchronized package demo5; import java.util.ArrayList; import j ...
随机推荐
- java 变量分类
转:https://blog.csdn.net/suneqing/article/details/37909811 1.按被声明的位置划分 局部变量:方法和语句块内定义的的变量.(在定义局部变量时,必 ...
- javascript中的undefined 和 not defined
经研究发现,两者之间有很大的区别,不知从英语讲,这两者都有啥区别,研究结果如下 测试os:ubuntu 测试浏览器:chrome 测试案例1 console.log(a) 报错 ReferenceEr ...
- python之循删list
先来看下循环遍历删除list元素的一段代码: L=[1,3,1,4,3,6,5] # 0 1 2 3 4 5 6(下标) for i in L: if i%2!=0:#%表示除商取余数,除以2余数为0 ...
- android apk 文件反编译
最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar 获取源码工具 地 ...
- 微信发送朋友圈URL JSAPI事件demo
<script> var imgUrl = 'http://m.ximiyu.com/content/images/thumbs/0000126_540.jpeg'; var lineLi ...
- Mybatis 入门之resultMap与resultType讲解实例
resultMap:适合使用返回值是自定义实体类的情况 resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型 resultMap : type:映射实体类的数据类型 id: ...
- PHP导出excel文件的多种方式
1.第一种实现的方法 set_time_limit(0); //逐条导出数据 ob_end_clean(); header("Content-type: application/vnd.ms ...
- 将本地的一个项目托管到自己的GitHub仓库
GitHub作为全球最大的代码托管平台,功能十分强大.我们可以在上面建立一个仓库来托管我们的代码图片等资源.因为使用markdown语法来写博客所以在插入图片时需要一个图片外链地址,起初去网上找了一个 ...
- 中文字体压缩器-解决css引入的字体太大的问题
字蛛是一个中文字体压缩器 官方网站:http://font-spider.org/index.html 用于解决页面引入的css字体过大的问题 使用方法: npm i -g font-spider 在 ...
- 编程语言十万个为什么之java web的基础概念
1.什么是JAVA Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, Ja ...