并发编程
文章平均质量分 74
永远少年1024
这个作者很懒,什么都没留下…
展开
-
锁是可重入的
一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁也就是说synchronized获得的锁是可重入的public class T { synchronized void m() { System.out.println("m start"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e)原创 2021-07-01 11:40:36 · 96 阅读 · 0 评论 -
模拟银行账户
很重要,对于理解 锁的是哪个对象很重要以及volatile的可见性并不能代表数据的一致性以及数据的原子性,因此volatile并非是数据安全的。模拟银行账户读写,数据是否一致public class Account_01 { private String name; private int balance; void set(String name, int balance) { // 此处睡两秒是为了保证 main 主线程先执行一次getBalance原创 2021-06-30 21:19:58 · 373 阅读 · 0 评论 -
synchronized 同步调用非同步
同步方法里面可以调用非同步方法public class T1 { // 示例演示同步方法和非同步方法同时调用 synchronized void m() { System.out.println("synchronized method" + new Date()); n(); } void n() { System.out.println("not synchronized method" + new Date())原创 2021-06-30 21:19:13 · 339 阅读 · 0 评论 -
synchronized 使用理解、锁类
接上篇,本篇演示锁加在类上面public class T { private static Integer count = 0; public static void m() { //任何线程要执行下面的代码,必须先拿到当前对象的锁 //锁的是当前对象 synchronized (T.class) { for (int i = 0; i < 100000; i++) { c原创 2021-06-30 21:18:38 · 347 阅读 · 1 评论 -
synchronized 使用理解、锁对象
目的本文只针对synchronized的使用进行描述以及代码演示。具体原理不做深入探讨简介synchronized 在多线程并发环境下,通过加锁的形式保证了数据的一致性,锁存在Java对象头里。如果对象是数组类型,则虚拟机用3个Word(字宽)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,一字宽等于四字节,即32bit。对象锁、代码块锁的使用先看一段示例代码代码块一public class T { private Integer count原创 2021-06-30 21:17:40 · 310 阅读 · 0 评论 -
volatile 指令重排的理解
指令重排内存可见性只是 volatile 的其中一个语义,它还可以防止 JVM 进行指令重排优化。举一个伪代码:int a=10 ;//1 int b=20 ;//2 int c= a+b;//3一段特别简单的代码,理想情况下它的执行顺序是: 1>2>3。但有可能经过 JVM 优化之后的执行顺序变为了 2>1>3。可以发现不管 JVM 怎么优化,前提都是保证单线程中最终结果不变的情况下进行的。可能这里还看不出有什么问题,那看下一段伪代码:privat.原创 2021-06-30 21:17:01 · 246 阅读 · 0 评论 -
volatile 非原子性
上一章节我们讲了 volatile的可见性的,以及可见性的演示,这里就会给大家产生一个误区,这样的使用方式很容易给人的感觉是对volatile修饰的变量进行并发操作是线程安全的。 其实不然,用volatile修饰的变量只有两个特性就是 可见性、禁止指令重排序。并不能保证线程的安全性 我们通过以下代码进行演示。 volatile int iCounter = 0; AtomicInteger atomicInteger = new AtomicInteger();原创 2021-06-30 21:16:32 · 227 阅读 · 0 评论 -
volatile可见性的理解
在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小。Volatile的官方定义Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。原创 2021-06-30 21:15:42 · 191 阅读 · 0 评论 -
线程的状态
线程共包括以下 5 种状态:1. 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。3. 运行状态(Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。...原创 2021-06-30 21:14:37 · 270 阅读 · 0 评论 -
线程的三个方法
SLEEPsleep 意思是睡眠,当前线程暂停一段时间让给别的线程去运行。sleep是怎么复活的?由你的睡眠时间而定,等睡眠到规定的时间自动复活,CPU 没有线程的概念,会不断的从内存中获取指令去执行,睡眠的意思就是当前线程让出cpu 由其他线程去执行。 static void testSleep() { new Thread(()->{ for(int i=0; i<100; i++) { System.out.原创 2021-06-30 21:12:55 · 94 阅读 · 0 评论 -
创建线程的几种方式
通过实现Runnable接口来实现public class T01_CreateThread { // 创建线程的三种方式 public static void main(String[] args) {// 通过实现Runnable接口来创建Thread线程// 1、写一个类实现Runnable 接口// 2、创建一个对象 RunnableMe runnableMe = new RunnableMe();//原创 2021-06-30 21:11:46 · 73 阅读 · 0 评论