JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java多线程与并发 java的并发,多线程,线程模型

wys521 2024-11-06 20:36:04 精选教程 38 ℃ 0 评论

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{ /**
  1. 有多个线程去访问 foo.mothodA() 时,同时只有一个线程能访问 foomothodA() 方法

  2. 一个类的实例对象有多个 synchronized 的方法时,只要一个线程访问了其中一个 synchronized 方法,其它线程就不能访问这个对象中的任何一个 synchronized 方法

  3. 不同实例对象间的 synchronized 方法调用时互不影响的

    Foo foo1 = new Foo();Foo foo2 = new Foo();

    不同的线程分别访问 foo1foo2 中的 synchronized mothodA() 方法是互不影响的,因为它们的监视器对象分别是 foo1foo2 ,同一个监视器对象才会阻塞同步

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 代码块

  1. 多个并发线程访问一个对象的 synchronized(this) 同步代码块时,同一时间只有一个线程执行

  2. 当一个线程访问一个对象的 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> 对象交换器

适用于两个线程需要交换数据的场景。

  1. 只能有2个线程交换数据

  2. exchange是交换点,另一线程未到达则本线程再次等待

  3. 各自线程exchange函数的返回值是另一线程exchange的参数值

public class FillAndEmpty{

分布式专题

高性能专题

大家可以点击加入群:606187239【JAVA大牛学习交流】里面有Java高级大牛直播讲解知识点 走的就是高端路线 (如果你想跳槽换工作 但是技术又不够 或者工作上遇到了 瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础不好的误入哟 只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表