关于synchronized 这东西就是看对象 目前也是很木乱 还是要多敲 自己REBUG 坑总是会填满的

—————–我是分割的小尾巴 啦啦啦啦

下列是方法

public synchronized void methodA(int a, int b);

public synchronized void methodB(int a){

methodA(a, 0);

}

那么对于顺序问题怎么看呢

要明白两个问题,1.锁的对象是谁,2.谁持有了锁。

假设方法A和B是在同一个类Test中的两个方法。

Test t=new Test();

t.methodB();

这个时候,methodB方法被调用时,因为加了synchronized ,需要先获得一个锁,这个锁的对象应该是t,也就是当前的这个Test类的实例,而获得锁的东西是线程,也就是说当前线程拿到了t的锁(而不是你说的B方法获得锁),这个时候B方法内调用methodA,因为A也加了synchronized,也需要获得一个锁,因为A和B都是Test类中的方法,所以当前线程要获得的锁的对象也是t。由于当前线程在执行B方法时已经持有了t对象的锁,因此这时候调用methodA是没有任何影响的,相当于方法A上没有加synchronized。

另一种情况:假设现在有两个Test类

Test t1=new Test();

Test t2=new Test();

t1.methodB();//此时当前线程持有了t1对象的锁

t2.methodB();//此时当前线程也持有了t2对象的锁

当前线程持有了两把锁,锁的对象分别是两个不同的Test类的实例t1和t2,互相没有影响。

再一种情况:假设在多线程环境下,两个线程都可以访问Test t=new Test();

此时假设thread1里调用t.methodB();同时thread2里调用t.methodB()

这时假设thread1先抢到t对象的锁,那么thread2需要等待thread1释放t对象的锁才可以执行B方法。

结果像这样:

thread1获得t的锁–thread1执行methodB–thread1执行methodA–释放t的锁—thread2获得t的锁–thread2执行methodB–thread2执行methodA–释放t的锁。

写在后面

如果是下面这个样子

public synchronized void methodA(int a, int b);

public synchronized void methodB(int a){

};

public static void main(String [ ] args){

TT tt =new TT ();

tt.start();

tt.method B(int a);

}// 因为方法A和方法B锁定的是同一对象中的方法 为synchronized 锁定的是对象而不是方法 那么当方法b先获得锁之后 那么a就发生阻塞 必须等到方法b执行完毕之后在去执行方法a 因为方法b为主线程的调用 会比开启新线程得到锁的速度要快 所以要根据情况设定SLEEP的时候来确定需要的线程先得到锁

附一下代码

package n1;

public class test11 implements Runnable{

int b =100;

public synchronized void A() throws InterruptedException{

System.out.println(Thread.currentThread().getName()+":"+"B值修改为1000");

b=1000;

System.out.println(Thread.currentThread().getName()+":"+"运行方法A");

Thread.sleep(5000);

System.out.println(Thread.currentThread().getName()+":"+"A" +b);

}

public synchronized void B() throws InterruptedException {

System.out.println(Thread.currentThread().getName()+":"+"运行方法b");

Thread.sleep(2500);

b=2000;

System.out.println(Thread.currentThread().getName()+":"+"B" +b);

}

public void run() {

try {

A();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) throws InterruptedException {

test11 t =new test11();

Thread i = new Thread(t);

i.start(); t.B();

System.out.println(Thread.currentThread().getName()+":"+"运行方法main"+t.b);

}

}

结果: main:运行方法b main:B2000 Thread-0:B值修改为1000 Thread-0:运行方法A main:运行方法main1000

java synchronized 顺序_Java synchronized 关于锁的对象顺序问题相关推荐

  1. java重排序_Java synchronized 能防止指令重排序吗?

    @ZealTalk 说的是 synchronized 可以防止指令重排,这个观点不对的,也欢迎回答的各位来讨论 synchronized 的有序性 来讨论这个问题先,先看看 Java 里的操作无序现象 ...

  2. java 静态方法枷锁_Java synchronized静态方法使用synchronized加锁

    昆明达内Java培训的老师上一期讲了Java synchronized实例方法使用synchronized加锁,这一期给同学们讲Java synchronized静态方法使用synchronized加 ...

  3. java synchronized 变量_Java Synchronized的用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...

  4. java 锁定界面_Java中的锁

    java中的锁遵循不同的分类方法,太多了,乐观锁/悲观锁,可重入锁/不可重入锁,有些第一遇到的话,可能还有点懵.刚好周末有时间学习下,总结和梳理下. 一总述 总的来说对java的锁有以下七种分类方法: ...

  5. java加锁等待_java中的锁池和等待池

    在java中,每个对象都有两个池,锁(monitor)池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法. 锁池:假设线程A已经拥有了某个对象(注 ...

  6. java图片序列化_Java中的强大武器——对象的序列化

    原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...

  7. java synchronized关键字_Java synchronized 关键字,你用的对吗?

    for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread.getName + " " + i) ...

  8. java synchronized 原理_Java Synchronized的原理

    我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的: public classSynchronizedDemo{public voidmethod(){synchro ...

  9. java类的运行顺序_Java语言类的基本运行顺序

    本文主要向大家介绍了Java语言类的基本运行顺序,通过具体的代码向大家展示,希望对大家学习Java语言有所帮助.我们以下面的类来说明一个基本的 Java 类的运行顺序:1. public class  ...

  10. java代码的运行顺序_java中的代码块执行顺序

    输入代码 blic static void main(String[] args) { { int x = 10;//限定变量的声明周期 System.out.println(x); } Studen ...

最新文章

  1. NA-NP-IE系列实验36:扩展ACL
  2. 【GoLang】tcmalloc jemalloc
  3. UITableView 重用机制
  4. 中石油训练赛 - Molecules(高斯消元解方程)
  5. javascript乘法和加法_Web前端:JavaScript中的NaN是什么?
  6. iOS开发拓展篇—音频处理(音乐播放器6)
  7. python基础教程第三版-《Python基础教程第三版》原版中英文PDF+代码+袁国忠(译)...
  8. 这101个网站你要是没进过,那你就OUT了
  9. 收银员使用的条码扫描枪如何判断好坏?
  10. (P57-P61)正则表达式
  11. MySQL 查询优化如何坐到极致?
  12. 谷歌浏览器无法安装扩展程序 – chrome无法添加crx插件的解决方法
  13. 【旧文集】一生伏首拜阳明-记于2017
  14. HarmonyOS的万里长征和万里长城
  15. wlan网页登录认证原理
  16. 32位程序在Windows上的内存问题
  17. 计算机网络up to down笔记_01
  18. seetaface6 GPU版本windows编译
  19. 区块链在车联网数据共享领域的研究进展
  20. 为什么空集是集合的子集_空集为什么是任何集合的子集和非任何空集的真子集呢...

热门文章

  1. C语言程序确定闰月,怎样计算闰月
  2. 使用Softice调试驱动程序
  3. ghd oracle,ghd ORACLE双管卷发棒怎么样?具有离子夹外型、卷发棒功能简直是手残少女救星...
  4. hdu 5510 strstr/find/KMP
  5. 使用NOKIA MMS LIBRARY发送中国移动彩信
  6. Poj 2456 Aggressive cows
  7. 【MATLAB】高维矩阵求和
  8. golang base64解码编码实现
  9. java实现串中找数字
  10. [转载]关于太阳(卫星)天顶角,太阳高度角,太阳方位角的整理_akala啦_新浪博客...