java架构《并发线程基础一》
1、实现线程常见的两种的方式 :
1:继承extends Thread
2:实现new Runnable 实现其run方法
2、线程安全
结论: 当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。
3、 关键字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");
原理:同一个类中,主线程main方法新开子线程 调用加锁的方法修改全局变量,在方法里打印修改后的结果。结果和修改后的一
致,在主线程打印,任是原数据,并没修改,证明,子线程修改和主线程没有任何关联。
6、synchronized的重入
原理:调用synchronized加锁的方法。其方法体还是可以继续调synchronized加锁的方法。这就是重入(父子关系extends)重入
一样,数据保持同步。
7、锁对象的改变问题
原理:使用全局变量的对象做为锁。新建两个线程。都调用了使用了全局变量加锁的方法。只要在synchronized(对象){代码块},
代码块修改全局变量的值 ,则对象锁发生了改变。
解决方案:同一对象属性的修改不会影响锁的情况 在线程启动时synchronized方法外修改对象,对象锁不影响 还是同一把锁
8、使用synchronized代码块减小锁的粒度,提高性能。也就是在代码块加锁。
java架构《并发线程基础一》的更多相关文章
- java架构《并发线程高级篇四》
本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...
- java架构《并发线程高级篇一》
本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...
- java架构《并发线程高级篇二》
本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...
- java架构《并发线程高级篇三》
本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...
- Java高并发 -- 线程池
Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...
- Java高并发--线程安全策略
Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...
- Java并发-线程池篇-附场景分析
作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- Java之创建线程的方式四:使用线程池
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...
- java架构《并发线程中级篇》
java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...
随机推荐
- Linux之远程登录和文件传输
一---导读 在实际开发过程中,程序员和Linux系统是远程的,并且可能有多个程序员一同在同一个linux系统上工作,那么这个时候就需要我们远程登录linux系统 二---软件介绍 xshell 和 ...
- PO,BO,VO,DTO,POJO,DAO,DO是什么?
PO (Persistent Object) 持久化对象,表示实体数据.BO (Business Object) 业务对象,主要是把逻辑业务封装为一个对象 .VO (Value/Vi ...
- NOIP初赛篇——03中央处理器CPU
CPU CPU(中央处理单元)是微机的核心部件,是决定微机性能的关键部件.20世纪70年代微型机的CPU问世,微型计算机的核心部件微处理器从Intel 4004,80286,80386,80486 ...
- 剑指offer 面试题7:重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- Java基础概念性问题整理,面试题型整理,附带答案详解供参考,首次整理!
题目目录 Java基础 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建对象的几种方式 7. ...
- 编译安装PHP - 7.3.16
编译安装PHP - 7.3.16 1 ) 安装依赖包: yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg ...
- python面向对象基础-属性/方法
- JS navigator.userAgent
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...
- docker logs 查看容器日志操作
查看日志 官方文档:https://docs.docker.com/engine/reference/commandline/logs/ # 查看指定数量的实时日志 # docker logs -tf ...
- 【ORA】 ORA-01031:权限不足的问题
今天创建一个用户,赋予dba权限,在plsql中选择sysdba登录,但是报错 ORA-01031 在网上找了好久最后的解决办法是 不仅仅要有dba权限 还要有这个权限: grant all priv ...