基本的线程同步块 只是使用对象 不存在你说的什么类锁(这里 先不讨论JDK1.5的同步工具包里面的那个Lock 就说synchronized 块) static同步方法是用的是当前类的Class对象(java.lang.Class 这个对象在做反射的时候)
也就是说
---------------------------------
一种是对象锁,类A中同步块和f1(),共用对象锁,所以当他们中的任一被锁,其他线程就不能访问另一个方法或同步块。至于其他方法是否能访问?我还是不清楚。
---------------------------------
如果是非静态的同步方法 使用的锁对象就是this 也就是当前对象 你使用同步块的话 关键不是看你的同步块写在哪个类里面 而是看他用的是哪个对象来锁定
另一种是类锁,静态同步方法都使用类锁,所以当一个类中的一个静态同步方法被锁,其他线程无法访问其他静态同步方法,至于其他方法能否访问?我还是不清楚。
---------------------------------
只要没有同步修饰 那么就和他们无关 不知道是不是你对同步块的理解有问题 疑问他锁的到底是什么东西 举个例子
synchronized (object){
}
就相当于你面前有道门 这个门要你必须要用object这个对象作为钥匙来开 所以 你就必须要获得这个钥匙 如果线程1进入这个同步块了 那么钥匙就被他一并带进去了 其他的线程要进入的话 就必须要等线程1出来
作为锁(或者说是钥匙)的这个object和你的同步块写在什么类里面是没有关系的 如果你有类A和类B各自有一个同步块 都是使用的是同一个对象(注意这里强调同一个对象) 作为锁的话 线程1进入类A同步块 这个时候 类B的这个同步块也会被锁掉 就相当于是 你的家门钥匙和你公司办公室的钥匙是同一把 要是你同事把你的钥匙拿去了 那你即进不了办公室 也进不了家门了一样的 但是 不代表你进不了公司茶水间 因为茶水间就没有锁
-----------------------------------------------------------------
同步块的基本形式是
synchronized (object) {
// DO Something
}
这成为使用object来锁定这一段代码 一旦有线程进入这一个代码块中 那么其他的线程就无法进入用同一个对象锁定的代码(包括这个同步块本身和 其他使用这个对象的synchronized (object) 都无法进入)
而如果一个类A 有一个方法为
public synchronized void fun()
那么就等同于用this 也就是这个对象自身来锁定这个方法的代码 那么 一旦有线程进入这个方法 类的所有非静态(注意 是非静态 静态方法下面再说)的同步方法 以及其他的用这个对象锁定的代码都无法进入
public synchronized static funStatic()
静态方法比较特殊 因为不存在有this 当前对象这个说法 所以 他使用的锁对象是 A.class 也就是 这个类的Class对象 他在JVM上由JVM保证是唯一一个 这样 锁定的效果就影响所有静态的同步方法
----------------------------------------------------------------
分享到:
相关推荐
你还在用synchronized?线程安全相关知识深入剖析
4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。
一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
.NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。...这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。
一个线程可以理解为一个人,打印字母可以理解为走路 张三走一步然后李四走一步。。。所有人走完第一步后,又从张三开始走下一步。 里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有...
Synchronized锁在Spring事务管理下,导致线程不安全。
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很...
编写程序创建Storage类的实例,并创建一个Counter对象和Printer对象操作此实例。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage...
它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中,锁膨胀(Lock Inversion)是一个重要的概念。当一个对象被多...
一个多线程访问的同一个资源,java synchronized互斥锁的用法,android和此用法一致。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
synchronized下的方法控制多线程程序中的线程同步非常方便,这里就来看一下Java使用synchronized修饰方法来同步线程的实例演示,需要的朋友可以参考下
synchronized与单例的线程安全问题,博客地址:https://www.jianshu.com/p/486ed9c8662a
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个synchronized方法只能由一个线程访问。 65、请说出你所知道的线程同步的方法。 答:wait():使...
Java中的synchronized:同步方法与线程安全
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很...
通过将 MyRunnable 对象传递给 Thread 类的构造方法,我们创建了一个新的线程,并将 run 方法作为线程的执行逻辑。 除了基本的线程创建和启动,Java还提供了一些管理线程的方法和工具,例如: sleep 方法:使当前...