网站首页 > 精选教程 正文
1. volatitle
volatitle
对共享变量进行同步。在写入 volatitle
变量值之后,CPU缓存中的内容会被协会主存,再读取 volatitle
变量值时,缓存值为失效状态,然后重新从主存读取已改变过的值。
2. synchronized 关键字
所有的Java对象都有一个与之关联的监视器对象,允许在该监视器上进行加锁和解锁
这里一定要理解清楚,我们 加锁的是监视器对象 ,而不是代码code
synchronized
静态方法监视器对象是所在Java类对应的
Class
synchronized
实例对象方法监视器对象是
当前对象实例
synchronized
代码块代码块声明中的对象
2.1 synchronized
方法
2.1.1. synchronized
关键字的继承性
synchronized
关键字是不能继承的,父类的 synchronized
方法在子类中并不是 synchronized
,子类需要显式地为某个方法加 synchronized
,以变成同步方法
2.1.2. synchronized
实例对象方法
synchronized
method(){}的 监视器对象是这个实例对象 ,加锁的对象不是这个方法,而是实例对象
public class Foo{ /**
有多个线程去访问
foo.mothodA()
时,同时只有一个线程能访问foo
的mothodA()
方法一个类的实例对象有多个
synchronized
的方法时,只要一个线程访问了其中一个synchronized
方法,其它线程就不能访问这个对象中的任何一个synchronized
方法不同实例对象间的
synchronized
方法调用时互不影响的Foo foo1 = new Foo();Foo foo2 = new Foo();
不同的线程分别访问
foo1
、foo2
中的synchronized mothodA()
方法是互不影响的,因为它们的监视器对象分别是foo1
、foo2
,同一个监视器对象才会阻塞同步
2.1.3 synchronized
static 静态方法
synchronized static staticMethodA()
的监视器对象是 Foo.class
类,所有访问这个类的静态同步方法的线程,都在同一个 Foo.class
上加锁和解锁,所以对所有线程中的类实例对象的同步起作用。
class Foo { public synchronized static methodA(); public synchronized static staticMethodA();
一个线程里调用了 Foo.staticMethodA()
,会对其它线程调用 foo.methodA()
造成同步
2.2 synchronized
代码块
多个并发线程访问一个对象的
synchronized(this)
同步代码块时,同一时间只有一个线程执行当一个线程访问一个对象的
synchronized(this)
同步代码块时,其它线程仍然可以访问这个对象的非synchronized(this)
代码块,而对对象中其它所有的synchronized(this)
同步代码块的访问都将被阻塞
class Foo { public void methodA()
public class Foo extends Thread{ private int val; //全局
3. Object类的wait、notify、notifyAll
/**
4.高级实用工具
4.1 java.util.concurrent.locks
中的API
锁可在对象之间传递,因此使用更灵活
4.2 java.util.concurrent.Semaphore
信号量
可以创建一个 new Semaphore(0)
零个许可的信号量作为一个阻塞点,另一个工作线程处理完一定的工作后 release()
释放一个许可出来,让前面阻塞的线程继续执行
4.3 java.util.concurrent.CountDownLatch
倒数闸门
4.4 java.util.concurrent.CyclicBarrier
循环屏障
4.5 java.util.concurrent.Exchanger<V>
对象交换器
适用于两个线程需要交换数据的场景。
只能有2个线程交换数据
exchange是交换点,另一线程未到达则本线程再次等待
各自线程exchange函数的返回值是另一线程exchange的参数值
public class FillAndEmpty{
分布式专题
高性能专题
大家可以点击加入群:606187239【JAVA大牛学习交流】里面有Java高级大牛直播讲解知识点 走的就是高端路线 (如果你想跳槽换工作 但是技术又不够 或者工作上遇到了 瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础不好的误入哟 只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)
猜你喜欢
- 2024-11-06 信号量限流,高并发场景不得不说的秘密
- 2024-11-06 面试卡在多线程?那就分享几道Java多线程高频面试题,面试不用愁
- 2024-11-06 Java并发系列之Semaphore源码分析
- 2024-11-06 66.java并发编程之Semaphore和CountDownLatch使用
- 2024-11-06 Java基础笔试练习(十五) java基础知识试题
- 2024-11-06 72道Java线程面试题,这些面试官必问
- 2024-11-06 Java并发基础-锁详细分析(可重入锁、读写锁、信号量等)
- 2024-11-06 Java并发工具:CountDownLatch CyclicBarrier Semaphore快速掌握
- 2024-11-06 死磕 java同步系列之Semaphore源码解析
- 2024-11-06 java中锁扩展Semaphore java中的锁怎么实现
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)