package Thread.synchronizedTest;
public class SynchronizedTest {
/**
* 锁住class对象
*/
public static void synchronizedStatic(){
synchronized(SynchronizedTest.class){
System.out.println("synchronizedStatic");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 锁住方法,lock标记打在该实力上
*/
public synchronized void synchronizedMethod(){
System.out.println("synchronizedMethod");
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 不会有影响,正常调用
*/
public void synchronizedMethod2WithNosynchronized(){
System.out.println("synchronizedMethod2WithNosynchronized");
}
/**
* synchronizedMethod 已经锁住实例,
* 再加锁不成功
*/
public void synchronizedMethod2(){
synchronized( this ){
System.out.println("synchronizedMethod2");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* synchronizedMethod 已经锁住实例,
* 再加锁不成功
*/
public void synchronizedMethod3(){
synchronized( this ){
System.out.println("synchronizedMethod3");
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
final SynchronizedTest t= new SynchronizedTest();
Thread th = new Thread( new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
t.synchronizedStatic();
}
} );
th.start();
th = new Thread( new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
t.synchronizedMethod();
}
} );
th.start();
th = new Thread( new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
t.synchronizedMethod2();
}
} );
th.start();
t.synchronizedMethod2WithNosynchronized();
t.synchronizedMethod3();
}
}
分享到:
相关推荐
但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 Java 中的 synchronized 关键字与线程平安问题,帮助开发者更好地理解和使用 synchronized 关键字。 首先,需要清晰的是 ...
synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...
每个Java对象都可以作为锁,`synchronized`关键字实际上是在获取和释放对象的监视器锁(也称为内置锁或互斥锁)。对于非静态方法,锁是当前对象;对于静态方法,锁是对应的类的Class对象。 三、synchronized的两种...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...
线程安全问题的解决方案不仅仅是添加`synchronized`关键字那么简单,还需要正确理解锁的范围和作用对象。在编写多线程代码时,应当尽量减少锁的粒度,以提高并发性能。同时,过度依赖同步可能导致死锁、活锁等问题,...
synchronized 关键字可以被用于两种范围内:对象实例和类范围。 1. 对象实例范围:synchronized 关键字可以被用于对象实例的方法上,以防止多个线程同时访问同一个对象的 synchronized 方法。例如: ```java public...
### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...
本文将探讨Synchronized关键字在解决并发控制中的作用及其使用方式。 首先,让我们回顾一下问题的背景:在给出的示例代码中,创建了10个线程,每个线程都对共享变量`count`进行10000000次的累加操作。理论上,最终...
一个线程可以同时持有类锁和对象锁,只要这些锁对应的资源不同。例如,一个线程可以调用类的静态同步方法,同时另一个线程调用同一个类的实例同步方法,这两个操作是可以并发进行的,因为它们锁定的对象不同。 在...
当`synchronized`关键字修饰一个非静态方法时,该方法的锁作用于`this`对象,即当前实例对象。这意味着,如果两个线程分别通过不同的实例对象调用同一个`synchronized`方法,它们可以并行执行,因为它们持有不同的...
synchronized 关键字通过 JVM 的监视器锁(Monitor)来实现,每个对象都关联着一个监视器锁。当一个线程进入同步代码块或同步方法并获取到锁后,其他试图进入的线程将会被阻塞,直到持有锁的线程退出同步块,其他...
Java中的`synchronized`关键字是实现线程同步的关键机制,它保证了在多线程环境下,对共享资源的访问是互斥的,防止了数据竞争和不一致的问题。synchronized通过锁的概念来控制对代码块或方法的访问,分为两种形式:...
因此,synchronized关键字锁住的是当前对象的实例,而不是Class对象。由于每个线程都有自己的对象实例,因此多个线程在执行时根本就没有竞争同一个对象锁。 为了解决这个问题,我们可以使用同步块来锁住当前类的...
本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...
并发编程是多线程环境下确保程序正确性的关键技术,而Java中的`synchronized`关键字则是实现并发控制的重要工具。`synchronized`关键字可以用于修饰方法或作为同步代码块,其核心目标是保证线程对共享资源的访问具有...
Java 中 Synchronized(对象锁)和 Static Synchronized(类锁)的区别 Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。...
对于静态(`static`)方法,`synchronized`关键字锁定的是类的Class对象,因此,无论有多少个类的实例,所有线程在访问静态同步方法时都需要获取类的Class对象锁。这意味着,即使有多个类实例,所有线程也无法同时执行...
对象锁和类锁是锁的两种形式,对象锁用于对象实例方法,类锁用于类的静态方法或者一个类的class对象。对象锁和类锁在锁的概念上基本上是一致的,但是它们之间有很大的区别。 Synchronized的用法 Synchronized可以...
在深入探讨Java的关键字与保留字之前,我们首先需明确两个概念:关键字和保留字。在编程语言中,关键字是预定义的具有特殊含义的标识符,它们在编译时被解析器识别并执行特定的功能;而保留字则是语言设计者为未来...
在编程语言的学习中,了解和掌握关键字是至关重要的一步,特别是在Java这种强类型的语言中。本文将深入探讨Java中的关键字,这些关键字是Java语法结构的基础,它们被Java编译器特殊处理,有着特定的含义和功能。 ...