今天本人给大家讲解一下多线程的线程同步,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!!

开始说线程同步前先来个小案例:

案例一启:所有的类都在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同步的更多相关文章

  1. delphi.thread.同步

    注意:此文只是讲线程间的同步,其它同步不涉及. 线程同步是个好话题,因为写线程经常会遇到,所以就写写自己知道的东西. D里面,同步(特指线程同步)从线程的角度来分,有几种情况: 1:主线程与工作线程的 ...

  2. Thread 同步线程(打印机同步)

    1.首先创建一个打印机对象 package cn.b.happy; public class Printer { Object o =new Object(); public void print() ...

  3. Java 多线程(Thread) 同步(synchronized) 以及 wait, notify 相关 [实例介绍]

    场景描述 有一家很大的商场,在某市有几个商品配送中心,并有几家分店,这家商场经营很多的商品,平时运营情况是这样的: 根据各分店的商品销售情况,给分店配送相应需求量的商品:并上架到分店指让的位置,供客户 ...

  4. process thread Fiber(linux)

    http://blog.chinaunix.net/uid-21084809-id-2215376.html Processes, kernel threads, user threads, and ...

  5. SWT中的多线程(Invalid thread access)

    最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...

  6. 使用HTTP的同步方式还是异步方式?

    同步与异步 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完 ...

  7. Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调

    两个线程执行任务有同步和异步之分,看了Quora上的一些问答有了更深的认识. When you execute something synchronously, you wait for it to ...

  8. ThreadLocal并不是一个Thread

    ThreadLocal是什么? 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁 ...

  9. 16.同步类容器Collections.synchronized

    voctor动态数组.同步类容器,底层实现基于:Collections.synchronized package demo5; import java.util.ArrayList; import j ...

随机推荐

  1. 03 - CDH 6.3.x 安装

    CDH 6.3.x 离线安装 环境 CDH 6.3.1 CentOS 7 官方文档 修改主机名,配置host文件 # 根据个人需要修改主机名称 hostnamectl set-hostname nod ...

  2. java第二节课 java语法基础动手动脑

    动手动脑1:枚举变量   运行EnumTest.java package test2; public class EnumTest {  public static void main(String[ ...

  3. 轮询本机所有网卡的IP地址

    #include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netine ...

  4. linux一些基本操作-防火墙操作

    防火墙操作 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [root@c ...

  5. 渗透利器-BadUSB 控制外网主机详解 Teensy2.0++

    准备工作 一块 Teensy2.0++ 的板子(淘宝一搜就有) Arduino编译器 1.8.7版本下载连接:arduino下载地址 Teensy插件 下载连接:Teensy下载地址 [外链图片转存失 ...

  6. python与模块的导入方式

    今日所得 模块 import from...import... 循环导入 相对导入 绝对导入 软件开发目录规范 模块 模块:是一系列功能的集合体 模块的三种来源:1.内置模块(Python解释器自带的 ...

  7. sql 优化之8个尽量

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...

  8. 蒲公英Ghost Win 7 Sp1(x86/x64)旗舰版 201910

    蒲公英Ghost Win 7 Sp1(x86/x64)旗舰版 201910 <ignore_js_op>  <ignore_js_op> <ignore_js_op> ...

  9. hadoop配置文件详解、安装及相关操作补充版

    一.      Hadoop伪分布配置           首先应该现在profile文件添加hadoop_home操作如下: export JAVA_HOME=/usr/java/jdk expor ...

  10. Leetcode 946. Validate Stack Sequences 验证栈序列

    946. Validate Stack Sequences 题目描述 Given two sequences pushed and popped with distinct values, retur ...