synchronize同步问题对于锁得理解
package test.synchronize;
public class AmSynchornizeClass {
private int index=0;
private static int staticIndex = 0;
//成员锁对象
private Object lock = new Object();
/**
* 锁对象是this
* @return
*/
public synchronized int getIndex() {
return index;
}
/**
* 锁对象this 等同于 public synchronized int getIndex(){...}
*/
public int getIndex2() {
synchronized (this) {
return index;
}
}
/**
* 锁对象时成员变量lock
* @return
*/
public int getIndex3() {
synchronized (lock) {
return index;
}
}
/**
* 错误案例:锁对象new Object()离开了方法getIndex4()块没有实际意义
* @return
*/
public int getIndex4(){
synchronized(new Object()){
return index;
}
}
public synchronized void increaseIndex() {
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
}
public void increaseIndex2() {
synchronized(this){
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
}
}
public void increaseIndex3() {
synchronized(lock){
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
}
}
/**
* 锁对象是AmSynchornizeClass.class等同于public static void substract2()
*/
public synchronized static void substract(){
staticIndex--;
}
public static void substract2(){
synchronized(AmSynchornizeClass.class){
staticIndex--;
}
}
}
package test.synchronize;
import org.junit.Test;
public class TestSynchronize {
@Test
public void testSynchronizedLock1() {
final AmSynchornizeClass asc1 = new AmSynchornizeClass();
final AmSynchornizeClass asc2 = new AmSynchornizeClass();
Runnable getThread = new Runnable(){
@Override
public void run() {
System.out.println("go into get method()...");
System.out.println(asc1.getIndex());
System.out.println("get out from get method()...");
}
};
Runnable increaseThread = new Runnable(){
@Override
public void run() {
System.out.println("go into increase method()...");
asc2.increaseIndex();
System.out.println("go out increase method()...");
}
};
Thread t1= new Thread(increaseThread);
Thread t2= new Thread(getThread);
t1.start();
t2.start();
try {
while(true){
if(t1.isAlive() || t2.isAlive()){
Thread.sleep(200);
} else {
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void testSynchronizeLock() {
final AmSynchornizeClass asc = new AmSynchornizeClass();
Runnable getThread = new Runnable(){
@Override
public void run() {
System.out.println("go into get method()...");
System.out.println(asc.getIndex());
System.out.println("get out from get method()...");
}
};
Runnable increaseThread = new Runnable(){
@Override
public void run() {
System.out.println("go into increase method()...");
asc.increaseIndex();
System.out.println("go out increase method()...");
}
};
Thread t1= new Thread(increaseThread);
Thread t2= new Thread(getThread);
t1.start();
t2.start();
try {
while(true){
if(t1.isAlive() || t2.isAlive()){
Thread.sleep(200);
} else {
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...
在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...
Java 中 synchronized 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过示例代码和实践案例,帮助读者深入理解 ...
Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...
`synchronized`关键字用于控制并发访问资源,避免数据不一致。`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信。另外,Java 5引入的`ExecutorService`和`Future`接口提供了更高级的线程池管理机制。 3...
Java中的`volatile`关键字是一个非常重要的并发控制工具,它提供了比`synchronized`关键字更为轻量级的同步机制。`volatile`关键字的主要作用是确保多线程环境下的可见性和禁止指令重排序,但不保证原子性。 **...
6. **多线程**:Java提供内置的线程支持,案例会介绍如何创建和管理线程,使用synchronized关键字进行同步,以及线程池的使用,这对于构建高并发应用至关重要。 7. **网络编程**:Java的Socket编程允许创建客户端和...
在"关于java的一些经典案例"这个主题中,我们可以深入探讨Java在不同领域的应用,通过具体的代码实例来学习和理解其核心概念。这些案例涵盖了基础语法、数据结构、异常处理、多线程、网络编程等多个方面。 1. **...
多线程是Java的一大亮点,教程将介绍如何创建和管理线程,包括线程同步机制(如synchronized关键字、wait()和notify()方法)以及线程池的使用。案例可能涉及模拟多个任务并行执行或实现简单的并发应用程序。 网络...
2. **继承与多态**:在设计案例中,可能会有动物、狗、猫这样的类层次结构,展示如何通过继承实现代码重用,并通过多态实现不同类型的对象共享相同的接口,增强程序的灵活性。 3. **异常处理**:Java的异常处理机制...
案例将展示如何创建和管理线程,处理线程同步和通信,如synchronized关键字、wait()、notify()和notifyAll()方法的应用。 反射是Java的另一个强大特性,允许在运行时检查和修改类、接口和对象。通过案例,你可以...
- 同步机制:synchronized关键字,Lock接口,以及死锁、活锁的概念。 - 线程池:ThreadPoolExecutor的配置与使用,以及线程池的优化策略。 6. IO与NIO - 流的概念:输入流、输出流的分类,以及各自的使用场景。 ...
10. **多线程**:Java提供了丰富的API支持并发编程,如Thread、Runnable接口,以及synchronized关键字,笔记可能涉及到线程的创建、同步和通信。 11. **枚举与注解**:枚举是Java中的特殊数据类型,而注解则是一种...
例如,一个关于多线程的案例可能会演示如何创建和管理线程,以及如何使用synchronized关键字保证数据的安全性。IO流的案例可能涵盖文件读写、数据的序列化和反序列化等。网络编程的案例可能包括TCP/IP通信和HTTP请求...
8. **多线程**:Java支持多线程编程,习题可能包括创建线程、同步机制(synchronized关键字和wait/notify方法)以及线程池的使用。 9. **文件和目录操作**:Java的File类和nio包提供了丰富的API用于操作文件和目录...
6. **多线程**:Java支持并发编程,源码中可能包含Thread类的使用,以及同步控制(synchronized关键字、Lock接口等)的应用,帮助理解多线程间的协作和竞争。 7. **反射机制**:Java的反射机制允许在运行时动态地...
6. **多线程**:Java支持多线程编程,案例可能包含Thread类和Runnable接口的使用,线程同步(synchronized关键字,wait()、notify()方法)等。 7. **图形用户界面(GUI)编程**:可能通过Swing或JavaFX库来创建窗口...
以下是一些Java中的十大经典案例,它们涵盖了不同领域的应用,帮助我们更好地掌握这门语言。 1. **单例模式**: 单例模式是一种限制类实例化次数的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在...
6. ** 多线程 **:Java支持多线程编程,案例可能包括创建Thread类的子类、实现Runnable接口,以及线程同步(如synchronized关键字、wait/notify机制)。 7. ** GUI编程 **:Java Swing或JavaFX库可以用来创建图形...