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 ...
随机推荐
- flink测试用例编写
使用tableFunction的collect总是npe, 实际可以自定义collector, 在collector中做自己想做的事 不使用现成的collector
- pycharm中无法调用pip的安装包
https://blog.csdn.net/sinat_23619409/article/details/79962518 较详细:https://blog.csdn.net/weixin_41287 ...
- yum命令不能使用的解决办法
以前yum命令一直是可用的,今天使用它安装命令时一直提示,如下图: 百度了一圈说是网络问题: 然后我就ping www.baidu.com 可以ping通啊 最后在同事的帮助下找到了解决办法: vi ...
- C++入门级小算法
反序输出一个整数 #include <iostream> using namespace std; int main() { int n; while (cin >> n)// ...
- python 写个冒泡排序吧
冒泡排序 介绍: 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作 ...
- 正则提取关键字符-python代码实现
原文地址:http://www.bugingcode.com/blog/python_re_extraction_key.html 关于python的正则使用在以前的文章中 http://www.bu ...
- 吴裕雄--天生自然 python开发学习笔记:pycharm无法使用ctrl+c/v复制粘贴的问题
在使用pycharm的时候发现不能正常使用ctrl+c/v进行复制粘贴,也无法使用tab键对大段代码进行整体缩进.后来发现是因为安装了vim插件的问题,在setting里找到vim插件,取消勾选即可解 ...
- Centos7上查看ext4文件系统的实际创建时间
前提:今日查看nginx日志时发现有报错,说是一些js,css文件找不到,于是想到去实际路径下查看文件是否确实不存在.结果出现下图中报错: 经过别人提醒查看文件的时间,于是看了一下登上服务器是9:52 ...
- 添砖加瓦:简述ELK部署
1.准备工作 ELK下载:https://www.elastic.co/downloads/ jdk version:1.8.0_162 2.环境搭建 ElasticSearch: (1)不能使用ro ...
- linux下时区的一些认识
最近搞ONVIF,在时间接口中有一个时区的字段,需要使用POSIX格式的时区,ONVIF手册要求符合IEEE100.3.1的第8章节,但要注册才能看IEEE标准,我印象中以前下载过,但找不到了.幸好, ...