【转】线程八锁

package com.java.juc;
/**
 * 题目:判断打印 "one" or "two"
 *
 * 1.两个普通同步方法,两个线程 ,标准打印,打印?// one two
 * 2.新增Thread.sleep(3000) 给getOne() 打印? // 3s 后打印 one two
 * 3.新增普通方法 getThreee 打印?// 先打印three 三秒后打印 one two
 * 4.两个普通同步方法,两个number对象,打印? // two 3s后打印 one
 * 5.修改getOne()为静态同步方法,一个number对象,打印?     // two 3s后打印 one
 * 6.修改两个方法均为静态同步方法,一个number对象,打印?// 3s 后打印 one two
 * 7.修改getOne()为静态同步方法,getTwo()为非静态同步方法 ,两个number,一个调用one,一个调用two //two 3s后打印 one
 * 8.两个都改为静态同步方法,两个number 一个调用getOne(),一个调用getTwo() //3s 后打印 one two
 * @author Administrator
 *
 */
public class TestThread8Monitor {

    public static void main(String[] args) {

        final Number number = new Number();
        final Number number2 = new Number();
        new Thread(new Runnable(){
            @Override
            public void run() {
                number.getOne();
            }
        }).start();
        new Thread(new Runnable(){
            @Override
            public void run() {
                number2.getTwo();
            }
        }).start();
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                number.getThree();
            }
        }).start();*/
    }

}

class Number{

    public static synchronized void getOne(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("one");
    }

    public static synchronized void getTwo(){
        System.out.println("two");
    }

    public void getThree(){
        System.out.println("three");
    }
}

某一时刻只有一个对象持有锁,不管有多少个方法,其他线程都无法持有锁

线程八锁的关键:

  1.非静态方法的锁默认为this,静态方法的锁为对应的Class 实例(类的字节码)。

  2.某一时刻内,只能有一个线程持有锁,无论几个方法。

转载自:http://www.cnblogs.com/wq3435/p/6366913.html

时间: 2024-10-11 22:36:34

【转】线程八锁的相关文章

java多线程 -- 线程八锁

一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法 加个普通方法后发现和同步锁无关 换成两个对象后,不是同一把锁了,情况立刻变化. 都换成静态同步方法后,情况又变化 所有的非静态同步方法用的都是同一把锁--实例对象本身,也

9.线程八锁

线程八锁 1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 2.当一个线程访问一个实例对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该实例对象中的synchronized(this)同步代码块. 3.当一个线程访问一个实例对象的一个synchronized(this)同步代码块时,其他线程对该对象中 /*所有其

(三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁

8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor pro = new Productor(clerk); Consumer cus = new Consumer(clerk); new Thread(pro, "生产

线程八锁

锁的是当前对象this,被锁定后,其他线程都不能进入到当前对象的其他的synchronized方法. 所有的非静态同步方法用的都是同一把锁 -- 实例对象本身 所有的静态同步方法用的也是同一把锁 -- 类对象本身 /* * 题目:判断打印的 "one" or "two" ? * * 1. 两个普通同步方法,两个线程,标准打印, 打印? //one two * 2. 新增 Thread.sleep() 给 getOne() ,打印? //one two * 3. 新增

11、JUC--线程八锁

线程八锁 • 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用 其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻 内,只能有唯一一个线程去访问这些synchronized方法 • 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的 synchronized方法 • 加个普通方法后发现和同步锁无关 • 换成两个对象后,不是同一把锁了,情况立刻变化. • 都换成静态同步方法后,情况又变化 • 所有的非静态同

《Cracking the Coding Interview》——第16章:线程与锁——题目5

2014-04-27 20:16 题目:假设一个类Foo有三个公有的成员方法first().second().third().请用锁的方法来控制调用行为,使得他们的执行循序总是遵从first.second.third的顺序. 解法:你应该想到了用lock的方法类阻塞,不过这里面有个概念问题使得直接用ReentrantLock不能通过编译(对于一个锁对象,不同在A线程中锁定,又在B线程中解锁,不允许这样的归属关系),可以用Semaphore来达到相同的目的.请看下面的代码. 代码: 1 // 16

《Cracking the Coding Interview》——第16章:线程与锁——题目3

2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只筷子后如果发现没有另一只了,就必须把手里这只筷子放下,这应该是通过破坏"请求保持"原则来防止死锁产生,请求资源失败时,连自己的资源也进一步释放,然后在下一轮里继续请求,直到成功执行. 代码: 1 // This is the class for chopsticks. 2 import j

《Cracking the Coding Interview》——第16章:线程与锁——题目2

2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常一起发生,每件只需要花几纳秒.如果你把A事件连续做几百万次,而B时间只做了几次,这样就能排除B事件对于测量的影响.如果总时间S = mA + nB.当m >> n 时,A≈S / m.下面的测量方法类似于打乒乓球,在主线程和副线程间互相传递一个令牌,这个令牌可以是变量.管道之类的用于通信的工具.与

《Cracking the Coding Interview》——第16章:线程与锁——题目1

2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: 1 // 16.1 What is the difference between process and thread? 2 Answer: 3 Process: 4 1. Basic element of resource allocation in the operating system. 5 2. Possesses independent