1、synchronized(this)的含义,是锁定当前对象,还是锁定一段代码,举个例子看看能另外一个线程能否访问这个类对private属性。 事实证明,synchronized修饰的method1的话,如果该类中method2没有加synchronized修饰符,则如果在执行 method1的过程中,主线程可以执行了method2,也就是说,如果method2改变该类属性的话,在method1得到的属性是改变后的属性。读脏数据。不一致性。如何解决,那就是method2前面也加synchronized修饰符。该修饰符表示获得这个对象的锁,一个对象只有一个锁,如果你想获得他的锁的话,你必须等我执行完成。所以如果一个类中有个synchronized方法,那么你要看看别的方法是否用到该方法中的属性,如果是则也要加synchronized。
注意在JVM中,有个计数器的,如果调用了某个带synchronized的方法,计数器+1,一开始是0,如果在执行该方法时候又调用了其他synchronized方法,那么计数器再+1,方法执行结束返回,计数器-1,知道计数器为0,表示这个对象的锁被释放了。
熟读线程中的TT.java搞清synchronized
TT.java
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
System.out.println("测试b = " + b);
Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
System.out.println("测试方法2:"+b);
Thread.sleep(2500);
b = 2000;
System.out.println("b= "+b);
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
//哈哈通过下面的循环主线程执行的m2被我搞到比t线程慢了
for(int i=0;i<100000;i++){
c+=i;
}
/*
try{
Thread.sleep(1000);//先让m1先执行输出b =1000,如果没加这句sleep则先执行m2,输出2000
//然后在执行m1,输出 b=1000
}catch(Exception e){} */
tt.m2();//再执行m2执行输出2000
try{
Thread.sleep(1000);//先输出1000,再输出 b=1000;记住主线程比子线程速度快就对了,相同行数
//也许主线程会优先
}catch(Exception e){}
System.out.println("这是2:"+tt.b);
System.out.println(c);
}
}
//你这样做,首先打印出测试b =100,过7秒钟,b=1000,然后把锁交给tt.m2,m2先打印出测试方法2:1000,等待2.5秒,后输出b=2000,最后输出这是2:2000
//一个对象一个锁
//猜测:主线程快,线程1:所以tt.m2()比m1()先调用,所以先执行m2方法,执行m2方法要2.5秒,然后执行m1方法,执行m1方法要5秒钟,
//主线程,过了2.5秒后,m2方法执行结束,过了1秒后,打印出tt.b的值。
//所以打印出的值是这样的,过了2.5秒后,首先打印出b=2000,接着就是测试b = 2000,然后过了1秒后,打印出2000,(这里为什么是1000,因为太快乐,线程1:b=1000)然后过5秒,打印出b=1000;
2、wait和sleep方法的区别,前面是object的,sleep是Thread类的,wait释放当前对象的锁,sleep不会释放。每个对象都有且只有一个锁,如果对象的类有多个synchronized方法,则先执行的方法首先获得该锁,而其他方法要等该方法执行完成才能获得该锁后才能执行,而获得该锁的方法还可调用其他synchronized方法,而此时jvm会跟踪加锁次数,刚刚是1,调用一个+1,直到全部执行完成为0时才自动释放。
分享到:
相关推荐
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞...
- `wait()`、`notify()`和`notifyAll()`方法用于线程之间的通信。 - `wait()`使当前线程等待,直到被另一个线程唤醒或等待时间到达。 - `notify()`随机唤醒一个等待线程。 - `notifyAll()`唤醒所有等待线程。 9...
本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...
总结来说,`wait()`和`sleep()`虽然都可以使线程暂停执行,但它们的目的和适用场景不同。`wait()`更多用于线程间的通信和协作,而`sleep()`则用于简单的延时控制。在实际开发中,根据具体需求选择合适的方法是非常...
Java提供了多种机制来实现线程间的通信,包括使用wait(), notify()和notifyAll()方法,以及使用synchronized关键字控制并发访问共享资源。这些方法都定义在java.lang.Thread类中。 1. **wait(), notify()和...
`wait()`、`notify()`和`notifyAll()`是对象级别的锁操作,它们必须在`synchronized`代码块内使用。`wait()`让当前线程释放对象锁并等待,`notify()`唤醒一个等待该对象的线程,`notifyAll()`唤醒所有等待的线程。...
在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统线程之间的关系。在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是...
Java提供了多种机制,如`wait()`, `notify()`, 和 `notifyAll()`方法,这些方法在`Object`类中定义,用于控制线程的执行顺序和同步。此外,`synchronized`关键字用于控制对共享资源的访问,避免竞态条件和数据不一致...
【多线程概念详解】 多线程是一种编程技术,它允许多...此外,还可以使用`wait()`、`notify()`和`notifyAll()`方法进行线程间的通信和协作。理解并熟练掌握这些概念和技术,是成为一名优秀的Java多线程程序员的基础。
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...
- 等待定时器:如`Object.wait()`或`Thread.sleep()`方法,让线程在指定时间后恢复执行。 - 等待条件变量:如`Condition`接口的`await()`方法,线程会在满足特定条件后被唤醒。 5. **死亡状态**(Terminated): ...
本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...
wait()和notify()用于线程间通信,一个线程等待另一个线程的通知才能继续执行。而ReentrantLock(可重入锁)提供更细粒度的控制,具有与synchronized相似的功能,但更加灵活,例如支持公平锁和非公平锁、可中断等待...
Java中wait和sleep的区别是Java多线程编程中一个重要的概念。这两个方法都可以用来暂停当前线程的执行,但是它们之间有着根本的区别。 首先,wait()是一个用于线程同步的实例方法,它可以在任何对象上调用,因为...
`Sleep` 和 `Wait` 是两个常用的方法,它们都可以让线程暂停执行,但它们的使用场景和机制有着本质的区别。 首先,`Sleep` 方法是定义在 `System.Threading.Thread` 类中的,它允许程序员指定一个时间段,在这个...
#### `wait()`与`suspend()`/`sleep()`的区别 `wait()`、`suspend()`以及`sleep()`都可以让线程暂停执行,但它们之间存在显著差异: - **`suspend()`**:已废弃,它会使线程暂停并保持锁的持有权,导致死锁风险...
`sleep()`与`wait()`的区别** - **`sleep()`**:`Thread.sleep(long millis)`方法使当前正在执行的线程暂停执行指定的时间,但不会释放任何锁。这种方法通常用于延时或调度定时任务。 - **`wait()`**:`Object....
wait方法与sleep和suspend方法的主要区别在于,wait方法可以释放锁,而sleep和suspend方法不能释放锁。wait方法可以让当前线程暂时放弃对象锁,让其他线程使用,而sleep和suspend方法不能做到这一点。 结论 在Java...