锁是可重入的
摘要:一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁也就是说synchronized获得的锁是可重入的 public class T { synchronized void m() { System.out.println("m start"); t
阅读全文
posted @
2021-06-30 22:18
XIN1024
阅读(59)
推荐(0)
模拟银行账户
摘要:很重要,对于理解 锁的是哪个对象很重要以及volatile的可见性并不能代表数据的一致性以及数据的原子性,因此volatile并非是数据安全的。 模拟银行账户读写,数据是否一致 public class Account_01 { private String name; private int ba
阅读全文
posted @
2021-06-30 22:17
XIN1024
阅读(148)
推荐(0)
synchronized 同步调用非同步
摘要:同步方法里面可以调用非同步方法 public class T1 { // 示例演示同步方法和非同步方法同时调用 synchronized void m() { System.out.println("synchronized method" + new Date()); n(); } void n(
阅读全文
posted @
2021-06-30 22:15
XIN1024
阅读(131)
推荐(0)
synchronized 使用理解、锁类
摘要:接上篇,本篇演示锁加在类上面 public class T { private static Integer count = 0; public static void m() { //任何线程要执行下面的代码,必须先拿到当前对象的锁 //锁的是当前对象 synchronized (T.class)
阅读全文
posted @
2021-06-30 22:14
XIN1024
阅读(115)
推荐(0)
synchronized 使用理解、锁对象
摘要:目的 本文只针对synchronized的使用进行描述以及代码演示。具体原理不做深入探讨 简介 synchronized 在多线程并发环境下,通过加锁的形式保证了数据的一致性,锁存在Java对象头里。如果对象是数组类型,则虚拟机用3个Word(字宽)存储对象头,如果对象是非数组类型,则用2字宽存储对
阅读全文
posted @
2021-06-30 22:13
XIN1024
阅读(245)
推荐(0)
volatile 指令重排的理解
摘要:指令重排 内存可见性只是 volatile 的其中一个语义,它还可以防止 JVM 进行指令重排优化。 举一个伪代码: int a=10 ;//1 int b=20 ;//2 int c= a+b ;//3 一段特别简单的代码,理想情况下它的执行顺序是: 1>2>3。但有可能经过 JVM 优化之后的执
阅读全文
posted @
2021-06-30 22:12
XIN1024
阅读(332)
推荐(0)
volatile 非原子性
摘要:上一章节我们讲了 volatile的可见性的,以及可见性的演示,这里就会给大家产生一个误区,这样的使用方式很容易给人的感觉是 对volatile修饰的变量进行并发操作是线程安全的。 其实不然,用volatile修饰的变量只有两个特性就是 可见性、禁止指令重排序。并不能保证线程的安全性 我们通过以下代
阅读全文
posted @
2021-06-30 22:11
XIN1024
阅读(96)
推荐(0)
线程的状态
摘要:线程共包括以下 5 种状态: 1. 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。 2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。
阅读全文
posted @
2021-06-30 22:04
XIN1024
阅读(395)
推荐(0)
volatile可见性的理解
摘要:在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是****轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronize
阅读全文
posted @
2021-06-30 21:33
XIN1024
阅读(302)
推荐(0)
线程的三个方法
摘要:SLEEP sleep 意思是睡眠,当前线程暂停一段时间让给别的线程去运行。sleep是怎么复活的?由你的睡眠时间而定,等睡眠到规定的时间自动复活,CPU 没有线程的概念,会不断的从内存中获取指令去执行,睡眠的意思就是当前线程让出cpu 由其他线程去执行。 static void testSleep
阅读全文
posted @
2021-06-30 21:31
XIN1024
阅读(57)
推荐(0)
创建线程的几种方式
摘要:通过实现Runnable接口来实现 public class T01_CreateThread { // 创建线程的三种方式 public static void main(String[] args) { // 通过实现Runnable接口来创建Thread线程 // 1、写一个类实现Runnab
阅读全文
posted @
2021-06-30 21:29
XIN1024
阅读(158)
推荐(0)