1、实现线程常见的两种的方式 :

   1:继承extends Thread
2:实现new Runnable 实现其run方法

2、线程安全
    结论: 当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。

3、 关键字synchronized(加锁)
    使用场景: 多个线程调用产生并发时。可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区"
   原理: /**

 * 分析:当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排对是按照CPU分配的先后顺序而定的),
 *  一个线程想要执行synchronized修饰的方法里的代码:
 *  1 尝试获得锁
 *  2 如果拿到锁,执行synchronized代码体内容;拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止,
 *     而且是多个线程同时去竞争这把锁。(也就是会有锁竞争的问题)
 */
      使用方式:
                       1、对象锁

                 在方法修饰符后面加 synchronized 或者方法块里面加 synchronized (this){方法块}
/**
* 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,
* 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),
*
* 在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。
* @author alienware
*
*/

2、 类锁

                   

            在方法里代码块加 synchronized (类.class){方法块}

                           3、任何对象锁
                            

            定义: private Object lock = new Object();
使用定义的对象做为锁 synchronized (lock){代码块} 注意事项:尽量不要直接使用字符串做为锁。这样有可能拿不到锁



4、对象锁线程同步和异步
     

 1  /**
2 * 分析:method1方法加锁(synchronized) method2不加锁
3 * t1线程先持有object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法
4 * t1线程先持有object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待,也就是同步
5 */
6 Thread t1 = new Thread(new Runnable() {
7 @Override
8 public void run() {
9 mo.method1();
10 }
11 },"t1");
12
13 Thread t2 = new Thread(new Runnable() {
14 @Override
15 public void run() {
16 mo.method2();
17 }
18 },"t2");
 5、线程原子性
             原理:同一个类中,主线程main方法新开子线程 调用加锁的方法修改全局变量,在方法里打印修改后的结果。结果和修改后的一
                        致,在主线程打印,任是原数据,并没修改,证明,子线程修改和主线程没有任何关联。

 

6、synchronized的重入
             原理:调用synchronized加锁的方法。其方法体还是可以继续调synchronized加锁的方法。这就是重入(父子关系extends)重入
                        一样,数据保持同步。

7、锁对象的改变问题
            原理:使用全局变量的对象做为锁。新建两个线程。都调用了使用了全局变量加锁的方法。只要在synchronized(对象){代码块},
                       代码块修改全局变量的值 ,则对象锁发生了改变。
            解决方案:同一对象属性的修改不会影响锁的情况   在线程启动时synchronized方法外修改对象,对象锁不影响 还是同一把锁

8、使用synchronized代码块减小锁的粒度,提高性能。也就是在代码块加锁。

java架构《并发线程基础一》的更多相关文章

  1. java架构《并发线程高级篇四》

    本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...

  2. java架构《并发线程高级篇一》

    本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...

  3. java架构《并发线程高级篇二》

    本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...

  4. java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...

  5. Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...

  6. Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...

  7. Java并发-线程池篇-附场景分析

    作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...

  8. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  9. Java之创建线程的方式四:使用线程池

    import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...

  10. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

随机推荐

  1. docker容器中布置静态网站

    docker容器中布置静态网站(基于云服务器ubuntu系统) 服务器准备(ubuntu) docker nginx 静态网页制作 浏览器测试 服务器布置 这里推荐使用云服务器(阿里云.华为云.腾讯云 ...

  2. three.js 显示中文字体 和 tween应用

    今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画.线案例请点击博客原文. 1. 生成中文字体 我们都使用过three.js的FontLoader加载typeface ...

  3. 7.24,《C Primer Plus》复习第十五章第二小题

    编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符,&运算符.|运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境,可以通过交互式让程序读取字符串) 编写 ...

  4. U盘容量变小处理

    参考: https://blog.csdn.net/weixin_39792252/article/details/80676300?utm_medium=distribute.pc_relevant ...

  5. 2.1 关系型数据的收集--Sqoop

    Sqoop应用场景: 1.数据迁移,将关系型数据库中的数据导入Hadoop存储系统 2.可视化分析结果,将Hadoop处理之后产生的结果导入关系型数据库,以便进行可视化展示 3.数据增量导入:减少ha ...

  6. Windows搭建SkyWalking8.3环境进行JAVA应用性能监控及入门示例(使用Mysql持久化)

    下载SkyWalking 一.下载地址(点击) 选择tar 解压后进入config文件夹先配置一下Mysql数据源,打开application.yml文件 默认selector是h2我们改成mysql ...

  7. 《Spring Boot 实战纪实》之前言

    目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...

  8. WebRTC ICE 状态与提名处理

    大家都知道奥斯卡有提名,其实在 WebRTC 的 ICE 中也有提名,有常规的提名,也有激进的提名,而且提名的候选人不一定是最优秀的候选人喔,本文就带你一探其中玄妙.文章内容主要描述 RFC 5245 ...

  9. 牛客网NC15二叉树的层次遍历

    题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [1 ...

  10. 【栈和队列】5、队列概述与数组队列的基本实现 - Java

    3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...