美文网首页
第三章对象锁类锁

第三章对象锁类锁

作者: 西西_20f6 | 来源:发表于2020-07-05 10:45 被阅读0次

Synchronized的两个用法:
一、对象锁:
包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)
Object instance = new Object();
public void synchronized hello(){}//锁对象默认当前this对象
synchronized(instance){}

二、类锁
指synchronized修饰静态的方法指定锁为Class对象,Class对象其实也是一个Object对象。类锁在同一时刻只能被一个对象拥有,即便是不同的Runnable实例,线程所对应的类锁也只有一个。相同的Runnable实例,线程对应的对象锁只有一个。
1,把synchronized 加在static方法上
public static void synchronized hello(){}
2,synchronized(*.class)
static synchronized (Object.class){}

三、t1,t2两个线程抢一个锁的时候,如果t1抢到了,那么此时t1就变成RUNNABLE状态,t2就是BLOCKED状态。

四、两个线程两个锁

package com.xixi;

/**synchronized的使用
 * 对象所示例1,代码块形式 created by ccai6 on 02/07/2020
 */
public class SynchronizedObjectCodeBlock2 implements Runnable {

  private static SynchronizedObjectCodeBlock2 instance
      = new SynchronizedObjectCodeBlock2();
  //自己创建对象锁
  Object lock1 = new Object();
  Object lock2 = new Object();

  @Override
  public void run() {

//    synchronized (this) {
    synchronized (lock1) {
      System.out.printf("线程[%s]进入lock1\n", Thread.currentThread().getName());
      try {
        Thread.sleep(3000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.printf("线程[%s]退出lock1\n", Thread.currentThread().getName());
    }
    synchronized (lock2) {
      System.out.printf("线程[%s]进入lock2\n", Thread.currentThread().getName());
      try {
        Thread.sleep(3000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.printf("线程[%s]退出lock2\n", Thread.currentThread().getName());
    }
  }

  public static void main(String[] args) {

    Thread t1 = new Thread(instance);
    Thread t2 = new Thread(instance);
    t1.start();
    t2.start();
    while (t1.isAlive() || t2.isAlive()) {

    }

    System.out.println("finished");

  }
}

实际上t1进入lock2和t2进入lock1这两个是可以同时进行的。

相关文章

  • 让你不再害怕JAVA的锁(一)

    java中的同步锁包括对象锁和类锁。 对象锁: 针对的是具体的对象实例;类锁:针对的是整个class类 现在先让我...

  • MySQL的锁怎么解?

    大家都知道java里面的synchronized,对象锁。(这里不扯什么类锁,对象锁,类锁其实就是Class对象的...

  • java类锁和对象锁

    java对象锁有两种:对象锁、类锁。 对象锁:在非静态方法上加锁。声明了一个对象锁。类锁:在静态方法上加锁,声明了...

  • synchronized

    类锁和对象锁

  • Synchronized的使用

    锁的类型 类锁:只有synchronized修饰静态方法或者修饰一个类的class对象时,才是类锁。 对象锁:除了...

  • synchronized 修饰静态方法、普通方法与代码块的区别

    概念: 类锁:所有对象共用一个锁 对象锁:一个对象一把锁,多个对象多把锁。 一、synchronized修饰普通方...

  • synchronized :同步锁

    synchronized 同步锁分为对象锁、类锁、静态方法锁、非静态方法锁等。其中对象锁和非静态方法锁的作用域是对...

  • 线程、多线程和线程池 二

    1.对象锁和类锁是否会互相影响? · 对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动...

  • 多线程开发艺术之对象锁和类锁

    一.对象锁和类锁是否会互相影响? ·对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程...

  • 第三章对象锁类锁

    Synchronized的两个用法:一、对象锁:包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己...

网友评论

      本文标题:第三章对象锁类锁

      本文链接:https://www.haomeiwen.com/subject/mifrqktx.html