java单线程上锁,Java多线程详解-锁

本文介绍了Java多线程中为何需要加锁,通过售票系统实例展示了无锁情况下线程并发导致的问题。文章详细讲解了三种加锁方式:synchronized代码块、同步方法和Lock接口的ReentrantLock。此外,还探讨了死锁现象,并通过示例代码展示了如何使用wait()、notify()和notifyAll()避免死锁,确保线程安全地执行。
摘要由CSDN通过智能技术生成

前言

最近工作有点忙,周末也一直在996加班,所以没有时间来写博客,今早忙里偷闲来写一下多线程的第二篇。

废话不多说,开始这次的主题。

复习

上一张我们学习了Java多线程的基础知识。回顾一下:

1:实现多线程的两种方式,继承Thread类以及实现Runable接口,然后重写里面的run方法即可。

2:线程的状态:

新建状态,就绪状态,运行状态,阻塞状态,死亡状态。

其中最重要的地方,也是难点就是线程的阻塞状态,线程在什么情况下会进入阻塞状态,如何解除阻塞状态。

3:线程的调度:

线程的优先级,线程睡眠,线程等待,线程让步,线程加入,线程唤醒。

这些都有相应的方法我再上一篇也都提到过。

4:线程中的常用函数:

sleep(long millis),join(),yield(),setPriority(),interrupt(),wait(),notify(),notifyAll()。

前面都讲过了,后面的interrupt(),wait(),notify(),notifyAll()这几个方法会结合今天的锁和中断来讲一下如何使用。

线程锁

首先来说说为什么要加锁。这里就要提到了共享资源这个话题,比如说:一个卖票系统,售票员有三个,总共有100张票,那么共享资源就是这100张票,有三个线程在一起消费它,当这100张票卖完时,三个线程就都得停止了。

我们都知道,线程在CPU中的机制时竞争机制,也就是说谁抢到了下一张票,谁就卖下一张票。但是要注意的是,当线程一抢到要卖的下一张票,准备抢占CPU资源运行时,线程二抢到了下一张票,并且抢到了CPU的资源,那么就会提前将下一张票卖出。这样就会导致票的顺序呗打乱。

可能我文字描述不太清楚,上一段代码看看。

class Count{

public static int count = 100;

}

@Data

class TicketThread implements Runnable{

private String name;

public TicketThread(String name){

super();

this.name = name;

}

@Override

public void run(){

int all = 1;

while (Count.count >0){

System.out.println(this.getName()+":::卖出了"+(all++)+"张,还剩"+ (--(Count.count))+"张");

}

}

}

class main{

public static void main(String[] args){

new Thread(new Ticket

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值