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()方法中的第一行和第二行代码,当它要执行后面的代码时,它的时间片没有了,在后面被thread02thread03cpu的执行权抢占了过来去执行了,这样导致了我们的方法结果有了不一致的现象。从而我们将提出了解决方案进行线程同步,来解决这个问题。

 

线程同步:

当多个线程在同一时间操作堆区或者方法区的某个数据时,有时会出现数据不一致的情况,如刚刚的案例所示。这种问题我们称它为线程安全问题。而一般线程同步多用于对一些敏感的数据不能同时访问时,而使用它。

线程同步语法:

在方法区中添加;

synchronized(同步锁对象){

}

线程同步的机制:

任意对象都可以作为锁对象,但每个对象只能有一个内置锁。线程同步代码块必须需要锁对象,某一个时刻锁对象只能被一个线程持有,当前的锁对象被占用时,它的状态会变成BLOCKED阻塞状态,而它的结束时机是在同步代码块中的代码全部执行完成后才会释放锁对象。

案例启:

修改的代码如下:

 

 

 

运行结果:

 

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

修改代码如下:

 

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

 

 

 现在的数据结果都没有问题了,是正确的输出了出来!!!

 

 创建Thread同步讲解完毕,又不懂或者不理解的可以在评论区给本人留言。

posted @ 2020-03-15 10:34  木木~五  阅读(192)  评论(0编辑  收藏  举报