package thread;
/**
* 线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,
* 这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,
* 直到这个线程执行完它所调用的同步方法,从中退出并释放该对象的同步锁之后。
* 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;
而同步方法是对这个方法块里的代码进行同步,这种情况下锁定的对象就是同步方法所属的主体对象自身。
如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,
这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块
如果这个方法是静态同步方法呢?
那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。
同步方法和同步块之间的相互制约只限于同一个对象之间,
所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。
* @author zengst
*
*/
public class NonSynchrTest {
public static void main(String args[]) {
//这里new了不同的对象,不存在线程冲突的问题
//注意,这里不是new多个对象,否则没有同步的意义(因为对象锁是对同一个对象而言的)
NonSynChrThread nc1 = new NonSynChrThread("mb1");
Thread t1 = new Thread(nc1);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread t2 = new Thread(nc1);
t2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread t3 = new Thread(nc1);
t3.start();
}
}
class NonSynChrThread implements Runnable{
public NonSynChrThread(String name){
}
public void run() {
System.out.println(Thread.currentThread().getName()+":thread start ! ");
print(10);
}
public synchronized void print(int n){
try {
for(int i=0;i< n ;i++){
System.out.println(Thread.currentThread().getName()+":print:"+i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
Thread-0:thread start !
Thread-0:print:0
Thread-0:print:1
Thread-0:print:2
Thread-1:thread start ! --这里说明在线程0执行同步块时依然有其他线程在非同步块外执行
Thread-0:print:3
Thread-0:print:4
Thread-2:thread start !
Thread-0:print:5
Thread-0:print:6
Thread-0:print:7
Thread-0:print:8
Thread-0:print:9
Thread-2:print:0
Thread-2:print:1
Thread-2:print:2
Thread-2:print:3
Thread-2:print:4
Thread-2:print:5
Thread-2:print:6
Thread-2:print:7
Thread-2:print:8
Thread-2:print:9
Thread-1:print:0
Thread-1:print:1
Thread-1:print:2
Thread-1:print:3
Thread-1:print:4
Thread-1:print:5
Thread-1:print:6
Thread-1:print:7
Thread-1:print:8
Thread-1:print:9
相关推荐
- **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...
在Java编程语言中,同步代码块(synchronized blocks)是一种重要的多线程控制机制,用于保证线程安全,防止数据的不一致性。本压缩包包含了两个示例代码——Example12.java和Example13.java,它们是针对同步代码块...
在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: 同步方法是指在方法声明前加上`synchronized`关键字,它会锁定该方法所在的对象。对于非静态方法,锁的是当前对象实例;对于静态...
Java中的`synchronized`关键字是实现多线程同步的重要机制,它确保了在并发环境中对共享资源的访问是线程安全的。以下是对`synchronized`的详细解读: ### 1. synchronized的特性 - **互斥性**:当一个线程进入一...
从性能角度考虑,同步代码块通常优于同步方法,因为它们只锁住必要的代码区域,而不是整个方法。这减少了死锁和资源竞争的可能性,提高了程序的并发性能。然而,选择同步代码块还是同步方法取决于实际需求,如果需要...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ##...
`@synchronized`关键字是Apple提供的一种简便的同步机制,它可以帮助开发者确保在多线程环境下对共享资源进行原子性操作,防止数据竞争问题。本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的...
因此,在设计多线程程序时,应尽可能减少同步的范围,只对那些确实需要保护的代码进行同步。 除此之外,Java 5引入了更高级的并发工具类,如`java.util.concurrent.locks`包下的`ReentrantLock`,它提供了可中断和...
本篇文章将深入探讨`synchronized`块同步方法及其应用,通过实例来阐述其工作原理。 首先,我们来看一个基本的例子。在上述代码中,`Example`类有一个`synchronized`修饰的`excute()`方法。这意味着当一个线程正在...
在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...
在上面的例子中,synchronized 关键字被用于代码块中,以实现对当前对象的互斥访问控制。 三、synchronized 关键字的继承 synchronized 关键字不能被继承,即基类的 synchronized 方法在继承类中不自动变成 ...
Synchronized 代码块是 Java 中的一种同步机制,它可以指定获取某个对象的钥匙,然后在该对象上的某个代码块中执行同步操作。Synchronized 代码块可以指定用哪一把钥匙才能开这个屏风的锁,可以用本房的钥匙,也可以...
当 synchronized 关键字加在方法上时,它锁定的是调用这个同步方法的对象。例如,在以下代码中: public synchronized void methodAAA(){ //…. } 这个方法是同步方法,它锁定的是调用这个方法的对象,如 P1。当...
除了方法前用 synchronized 关键字,synchronized 关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是:synchronized(this){/*区块*/},它的作用域是当前对象。 synchronized 的使用...
通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致性问题。 #### 二、synchronized的作用机制 `synchronized`主要通过对象...
避免不必要的同步控制,只在绝对必要的地方使用。 为了更好地利用`synchronized`,需要考虑以下几点: - **锁定粒度**:尽可能减小同步的范围,只同步必要的代码,避免过多的同步导致性能下降。 - **死锁预防**:...