c语言多线程访问一个变量_由浅入深学习Java多线程和高并发

本文介绍了Java多线程的两种实现方式,线程生命周期,深入探讨了`synchronized`和`volatile`关键字,以及Java内存模型的重要性。分析了线程状态变化、并发安全问题以及 volatile 的限制。文中还讨论了重排序对并发的影响,并解释了Java内存模型如何确保可见性和原子性。
摘要由CSDN通过智能技术生成

大家好,我是阿七。

这是以前的学习笔记,阿七把它整理了一下分享给大家,主要涉及以下5个知识点,感兴趣的小伙伴可以看看。

  1. 实现多线程的两种方法及源码分析
  2. 线程的生命周期及相关方法
  3. synchronized关键字
  4. volatile关键字
  5. Java内存模型

一、实现多线程的两种方法及源码分析

官方文档说明,实现多线程的方法有且仅有两种,其他实现方式底层说白了还是属于这两种,所以,以后面试官再问你这个问题,可以直接怼上去了哈哈。1、继承Thread类

public class ThreadStyle extends Thread{    @Override    public void run() {        System.out.println("用Thread类实现线程");    }    public static void main(String[] args) {        new ThreadStyle().start();    }}

2、实现Runnable接口

public class RunnableStyle implements Runnable{    public static void main(String[] args) {        Thread thread = new Thread(new RunnableStyle());        thread.start();    }    @Override    public void run() {        System.out.println("用Runnable方法实现线程");    }}

在上面的代码中,我们看到了start()和run()方法,二者区别在于:

run():只是一个普通方法,单独调用run()不会启动线程

start():启动新线程并告知jvm可以来运行该线程

3、start()源码分析
我们可以通过源码知道start()执行的顺序是:

1、启动新线程检查线程状态(必须是未启动的才可以)

2、加入线程组

3、调用start0()

注意:
1、start()是被synchronized修饰的,可以保证线程安全;

2、由jvm创建的main方法线程和system组线程,并不是通过start()方法启动;

3、不能两次调用start()方法,否则会报IllegalThreadStateException异常;

b7b8ba474d43968bc5a7ceb64b3b9d60.png

二、线程的生命周期

1、线程的6种状态
New:创建还未启动
Runnable:调用start()后,(可运行的)或者(在运行的),要等待CPU时间片来运行
Blocked:当一个线程进入到被synchronized关键字修饰的方法(代码块)时,且该锁已经被其他线程拿走,此时线程状态就是
Waitin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值