标题重复率高,所以取名---java学习第四天(多线程2)

前言

上一篇文章,主要是将了线程的创建等基础内容,这次的文章主要以,多线程开发过程中可能会遇到的问题为主。废话不能多,节奏快起来~~~~~

线程安全问题

线程安全问题会一直出现在多线程开发的过程中,特别是当有多个线程需要共用一个数据的时候,那么就可能会出现线程安全问题。那么计算机一般会采取一些同步通信机制来控制这些问题(如果大家想要细微了解,可以去看看操作系统相关的知识,如果我进展比较快,我就单独写一篇讲讲一些和java相关的操作系统的知识)

java线程安全问题解决方法(同步技术)

1.同步代码块

synchronized(同步锁对象){
    
}
//这里的对象可以是任意的对象(当然一般情况下就直接放object类的对象,但是记住这个对象必须在这个代码块外声明初始化)

这里的这个对象就好像是一把锁,在这个代码块中的代码执行完之后,外面的线程才会进行,外面所有其他的对象都会抢占这个锁。
弊端:就是这样的方式代码的效率比较低,因为每个线程都会去判断这个锁


方式二:同步方法

public synchronized void method(){
}
//静态方法
public static synchronized void method(){
//如果是静态的方法,那么在run()方法中就得用synchronized(实现类.class)

定义的这个同步方法会把方法内部的代码都被锁住,只让一个线程执行,同步方法锁住的对象是this


方式三:lock锁
Lock实现提供了比使用synchronized()方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 con’dition。
使用步骤:
1.创建实现类Renntreantlock对象(lock是个接口,所以只能用实现类)
2.在问题代码之前上用lock()方法;
3.在问题代码之后用unlock()方法;

private Lock lock=new Renntreantlock();//创建实现类的对象
lock.lock();
{
代码块
}

lock.unlock();

等待唤醒机制

线程之间的协调机制,多个线程处理同一个资源,但是每个线程的任务都不相同,所以这个时候就需要一个协作的关系。比如买手机这个过程:手机厂商生产好手机,然后告诉买家,买家再去购买;买家需要手机,然后告诉手机厂商去生产。生活中这样有先后顺序的功能都是需要同步机制去通信的。

1.等待唤醒的方法

1.wait():这个方法会将线程放入一个Waitset结合当中,不参与同步锁的竞争,不浪费cpu资源,此时线程进入waiting状态。那么需要等到另一个线程notify(),才能进入就绪队列
2.notify():通知waitset集合中的线程释放,一般是等待时间最长的那个线程
3.notifyAll():通直waitset集合中所有的等待着的线程进入就绪队列
注意:但是记住即使通知了,也不能立马让线程执行,因为它还在同步块呢,他需要去接着竞争同步锁,才能执行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值