关键字synchronized 的理解
1.锁定当前对象;
2.保证当前对象中
所有 有 synchronized 标志的方法 同一时间 只能有一个线程访问
3.对当前对象中,没有synchronized标志的方法,没有限制
-----------------------------------------------------------------
public class LockTest {
public synchronized void say(){
Thread t = Thread.currentThread();
System.out.println("say is call by " + t);
}
public synchronized void say1(){
Thread t = Thread.currentThread();
System.out.println("say1 is call by " + t);
try {
t.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println("say1 is call by " + t);
System.out.println("say1 " + t + "执行完毕");
}
public synchronized void say2(){
Thread t = Thread.currentThread();
try {
t.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("say2 is call by " + t);
System.out.println("say2 " + t + "执行完毕");
}
}
public class Test {
private static LockTest lockTest = new LockTest();
private static Thread test1;
private static Thread test2;
public static void main(String[] args) {
Test test = new Test();
test.ini();
test1.start();
test2.start();
lockTest.say();
// lockTest.say1();
// lockTest.say2();
}
private void ini(){
test1 = new Thread(new RunTest1());
test2 = new Thread(new RunTest2());
}
private class RunTest1 implements Runnable{
@Override
public void run() {
System.out.println("线程0开始启动");
lockTest.say1();
}
}
private class RunTest2 implements Runnable{
@Override
public void run() {
System.out.println("线程1开始启动");
lockTest.say2();
}
}
}
-------------------------------------------------------------
运行结果:
say is call by Thread[main,5,main]
线程1开始启动
线程0开始启动
say2 is call by Thread[Thread-1,5,main]
say2 Thread[Thread-1,5,main]执行完毕
say1 is call by Thread[Thread-0,5,main]
say1 Thread[Thread-0,5,main]执行完毕
因cpu分配给线程 时间片,不是每次运行结果都一样(mian,thread0,thread1的顺序)
单不会出现say1, say2 或 线程0,线程1 嵌套执行的情况
分享到:
相关推荐
synchronized() 中是锁住的对象,synchronized(this) 锁住的只是对象本身,同一个类的不同对象调用这个方法并不会被锁住,而 synchronized(className.class) 实现了全局锁的功能,全部这个类的对象调用这个方法都受...
Java的`synchronized`关键字、Lock接口和并发工具类(如Semaphore、CountDownLatch)可以用来控制并发访问,防止数据冲突。 6. **异常处理**: 在网络通信和音频处理过程中,可能会遇到各种异常情况,如网络中断、...
8. **多线程**:Java支持多线程编程,教程会介绍线程的创建、同步机制(如synchronized关键字、wait/notify方法)、线程池等。 9. **网络编程**:讲解Socket编程,包括TCP和UDP通信,以及服务器端和客户端的实现。 ...
JDK6API中文参考文档[沈东良](070114).chm文件包含了以上所有内容的详细解释,对于每个类、接口、方法,都有清晰的描述、参数说明和示例代码,方便开发者查阅和学习。在实际开发过程中,开发者通常会频繁地查阅这份...
除了使用传统的`SimpleDateFormat`,还可以利用Java 8及更高版本中引入的`java.time`包来进行更为高效和清晰的日期时间处理。例如: ```java import java.time.LocalDate; import java.time.format....
【模拟电话(JAVA)】程序是使用JAVA编程语言实现的一个小型应用程序,旨在模拟真实电话的各种功能,让开发者或用户能够了解电话系统的基本工作原理。在JAVA编程中,模拟电话这样的项目是一个很好的实践案例,它涉及...
在Java中,你需要找到相应的库或框架来实现相同的功能,如Swing或JavaFX用于图形界面,JDBC用于数据库访问。 7. **线程和并发**:Delphi的多线程处理与Java的线程模型有区别。Java提供了更丰富的线程同步和并发工具...
以上知识点是Java编程中不可或缺的部分,"JAVA解惑.pdf"很可能详细讲解了这些内容,为读者提供了一条清晰的学习路径,以解答他们在学习过程中遇到的困惑。通过深入学习这些内容,开发者可以提升自己的Java技能,更好...
5. **多线程**:Java支持多线程编程,考生需要了解Thread类和Runnable接口,以及同步机制如synchronized关键字和wait/notify方法。 6. **图形用户界面GUI**:Java提供了Swing和JavaFX等库来创建图形用户界面,考生...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大的功能而闻名。这份"java基础教程ppt"提供了一个全面的学习资源,帮助初学者掌握Java编程的基本概念和语法。 在Java的基础教程中,通常会包含...
此外,运算符的使用和流程控制结构的掌握将帮助编写出逻辑清晰的代码。 其次,笔记中应该会深入讲解类和对象的概念,这是面向对象编程的核心。初学者会了解到如何定义一个类,创建对象,以及如何通过方法来实现类的...
Java提供了synchronized、volatile、Lock等机制,开发者需了解其用法和限制,并根据需求选择合适的同步策略。 5. **数据库操作**:在Java后端开发中,数据库操作通常是业务逻辑的一部分。规范可能涵盖SQL编写规范、...
7. **文档说明**:一个良好的项目应该包含清晰的文档,解释其工作原理、如何使用以及如何进行定制。这有助于其他开发者理解代码并进行二次开发。 8. **性能优化**:对于大规模的端口扫描,性能优化至关重要。可能的...
6. **多线程**: JAVA支持多线程编程,课件会涉及Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()等)以及线程池的使用。 7. **反射与注解**: 反射允许程序在运行时动态地获取类的信息并...
此外,源代码注释是理解项目的重要部分,它们为代码的功能和实现逻辑提供了清晰的解释。开发者可以从中学习到如何组织代码结构,如何编写高质量的注释,以及如何将复杂的网络下载逻辑分解为可管理的模块。 附带的...
9. **多线程**:Java内置对多线程的支持,包括Thread类和Runnable接口,以及同步机制(synchronized关键字、wait()和notify()方法),理解和应用多线程能提升程序的并发性能。 10. **输入/输出系统**:Java的IO流...
首先,`Java编程规范`是指导程序员编写清晰、可读性强、易于维护代码的标准。它包括命名规则、注释规范、代码格式化等方面。遵循这些规范可以提高代码质量,使团队合作更加顺畅。例如,类名应使用驼峰式命名,常量全...
例如,类名应采用驼峰式命名,变量名应简洁明了,注释要清晰地解释代码功能。 其次,基础语法是Java学习的起点,包括数据类型(基本类型和引用类型)、运算符、流程控制语句(如if、switch、for、while等)、数组和...