`
magicxin
  • 浏览: 16805 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

线程-synchronized(this)的含义和wait和sleep的区别

    博客分类:
  • Java
阅读更多
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时才自动释放。
分享到:
评论

相关推荐

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    jvm线程生命周期以及线程的状态切换,探究sleep和唤醒的原理。

    多线程,高并发.pdf

    2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,在什么情况下分别使用他们? 4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java...

    java并发编程面试题

    sleep() 和 wait() 有什么区别? 什么是线程同步和线程互斥,有哪几种实现方式? Java 线程数过多会造成什么异常? 并发编程-Java内存模型 ## as-if-srial规则和happens-before规则的区别 synchronized、volatile、...

    threadtest.zip

    什么是线程同步?什么是线程安全?什么是线程锁?synchronized怎么用?如何理解wait()和sleep()的区别?超详细例程讲解-------手摸手教会小白 例程案例

    java线程学习笔记

    一 基本知识 2 1.1 任务Runnable 2 1.2 线程构造器Threat 2 1.3 执行器Executor 2 ...2.5 线程合作(wait || notifyAll) 21 2.5.1 Wait()两种形式 21 2.5.2 互斥的实现 22 2.5.3 notify()与notifyAll() 24

    这就是标题—— JUC.pdf

    wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程锁 并发下的集合类 List Set Map ...

    高级开发并发面试题和答案.pdf

    Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会...

    java笔试题大集合及答案(另附各大公司笔试题)

    61、sleep() 和 wait() 有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类...

    线程间通信

    public synchronized void put(String name,String sex){ this.name=name; try{ Thread.sleep(10); }catch(Exception e){ System.out.println(e.getMessage()); } this....

    jstack生成的Thread Dump日志.docx

    当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(通常是被synchronized的对象)的wait()方法,放弃Monitor,进入 "Wait Set"队列。只有当别的线程在该对象上调用了 ...

    线程基础知识-必知必会

    start() 和 run() 区别sleep() 和wait() 的区别blocked 状态和waiting 状态的区别线程的常用方法join() 和 yeild()创建线程有哪些方式?你平时是怎么写的?线程池的三个方法,七大参数,四种策略?如何配置线程池...

    Java多线程问题

    1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 2)在Java中Lock接口比synchronized块的优势是什么? 3)在java中wait和sleep方法的不同?

    JAVA多线程技术分享-39页PPT(winding)

    分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...

    史上最全java面试,103项重点知识,带目录

    41. sleep() 和 wait() 有什么区别? 16 42. notify()和 notifyAll()有什么区别? 16 43. 线程的 run()和 start()有什么区别? 16 44. 创建线程池有哪几种方式? 17 45. 线程池都有哪些状态? 18 46. 线程池中 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】sleep()和wait()分别是哪个类的方法,有什么区别? 79 【多线程】sleep()和yield()的区别 79 【多线程】对synchronized理解?用在代码块和方法上有什么区别? 80 【多线程】Volatile的理解 82 【*多线程】...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、线程生产者消费者的综合实战结合Java8语法.mp4 │ 高并发编程第一阶段29讲、如何实现一个...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、线程生产者消费者的综合实战结合Java8语法.mp4 │ 高并发编程第一阶段29讲、如何实现一个...

    并发编程面试专题.pdf

    3)在 java 中 wait 和 sleep 方法的不同? 4)用 Java 实现阻塞队列。 5)用 Java 写代码来解决生产者——消费者问题。 6)用 Java 编程一个会导致死锁的程序,你将怎么解决? 7) 什么是原子操作,Java 中的原子操作...

    Java常见面试题208道.docx

    41.sleep() 和 wait() 有什么区别? 42.notify()和 notifyAll()有什么区别? 43.线程的 run()和 start()有什么区别? 44.创建线程池有哪几种方式? 45.线程池都有哪些状态? 46.线程池中 submit()和 execute()方法有...

    leetcode题库-java-interview:Java研发基础相关

    leetcode题库 ...进程与线程的区别 进程通信 创建线程的方式 线程的状态转换 线程安全 上下文切换 死锁 同步 异步 阻塞 非阻塞 synchronized & Lock volatile ThreadLocal sleep & wait 线程通信 线

Global site tag (gtag.js) - Google Analytics