精华内容
下载资源
问答
  • java的内置:每个java对象都可以用做一个实现同步的,这些成为内置。线程进入同步代码块或方法的时候会自动获得该,在退出同步代码块或方法时会释放该。获得内置的唯一途径就是进入这个的保护的同.....

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法。

    因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识。

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。

    java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去。

    java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。

    1、对象锁的synchronized修饰方法和代码块:

    public class TestSynchronized

    {

    public void test1()

    {

    synchronized(this)

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    }

    public synchronized void test2()

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    public static void main(String[] args)

    {

    final TestSynchronized myt2 = new TestSynchronized();

    Thread test1 = new Thread(  new Runnable() {  public void run() {  myt2.test1();  }  }, "test1"  );

    Thread test2 = new Thread(  new Runnable() {  public void run() { myt2.test2();   }  }, "test2"  );

    test1.start();;

    test2.start();

    //         TestRunnable tr=new TestRunnable();

    //         Thread test3=new Thread(tr);

    //         test3.start();

    }

    }

    上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可传入其他对象的实例;第二个方法是修饰方法的方式进行同步。因为第一个同步代码块传入的this,所以两个同步代码所需要获得的对象锁都是同一个对象锁,下面main方法时分别开启两个线程,分别调用test1和test2方法,那么两个线程都需要获得该对象锁,另一个线程必须等待。

    2、类锁的修饰(静态)方法和代码块:

    public class TestSynchronized

    {

    public void test1()

    {

    synchronized(TestSynchronized.class)

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    }

    public static synchronized void test2()

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    public static void main(String[] args)

    {

    final TestSynchronized myt2 = new TestSynchronized();

    Thread test1 = new Thread(  new Runnable() {  public void run() {  myt2.test1();  }  }, "test1"  );

    Thread test2 = new Thread(  new Runnable() {  public void run() { TestSynchronized.test2();   }  }, "test2"  );

    test1.start();

    test2.start();

    //         TestRunnable tr=new TestRunnable();

    //         Thread test3=new Thread(tr);

    //         test3.start();

    }

    }

    类锁修饰方法和代码块的效果和对象锁是一样的,因为类锁只是一个抽象出来的概念,只是为了区别静态方法的特点,因为静态方法是所有对象实例共用的,所以对应着synchronized修饰的静态方法的锁也是唯一的,所以抽象出来个类锁。那么两个线程都需要获得该对象锁,另一个线程必须等待。

    3、synchronized同时修饰静态和非静态方法:

    public class TestSynchronized

    {

    public synchronized void test1()

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    public static synchronized void test2()

    {

    int i = 5;

    while( i-- > 0)

    {

    System.out.println(Thread.currentThread().getName() + " : " + i);

    try

    {

    Thread.sleep(500);

    }

    catch (InterruptedException ie)

    {

    }

    }

    }

    public static void main(String[] args)

    {

    final TestSynchronized myt2 = new TestSynchronized();

    Thread test1 = new Thread(  new Runnable() {  public void run() {  myt2.test1();  }  }, "test1"  );

    Thread test2 = new Thread(  new Runnable() {  public void run() { TestSynchronized.test2();   }  }, "test2"  );

    test1.start();

    test2.start();

    //         TestRunnable tr=new TestRunnable();

    //         Thread test3=new Thread(tr);

    //         test3.start();

    }

    }

    上面代码synchronized同时修饰静态方法和实例方法,但是运行结果是交替进行的,这证明了类锁和对象锁是两个不一样的锁,控制着不同的区域,它们是互不干扰的。同样,线程获得对象锁的同时,也可以获得该类锁,即同时获得两个锁,这是允许的。

    到这里,对synchronized的用法已经有了一定的了解。这时有一个疑问,既然有了synchronized修饰方法的同步方式,为什么还需要synchronized修饰同步代码块的方式呢?而这个问题也是synchronized的缺陷所在

    synchronized的缺陷:当某个线程进入同步方法获得对象锁,那么其他线程访问这里对象的同步方法时,必须等待或者阻塞,这对高并发的系统是致命的,这很容易导致系统的崩溃。如果某个线程在同步方法里面发生了死循环,那么它就永远不会释放这个对象锁,那么其他线程就要永远的等待。这是一个致命的问题。

    一个类的对象锁和另一个类的对象锁是没有关联的,当一个线程获得A类的对象锁时,它同时也可以获得B类的对象锁。

    展开全文
  • 答案是A, synchronized关键字是同步代码块关键字, 对对象加互斥锁 详解: synchronized: 用来给对象和方法或者代码块加锁. 当它锁定一个方法或者一个代码块的时候, 同一时刻最多只有一个线程执行这个段代码 volatile:...

    A. synchronized
    B. volatile
    C. serialize
    D. static

    答案是A, synchronized关键字是同步代码块关键字, 对对象加互斥锁

    详解:

    synchronized:

    用来给对象方法或者代码块加锁. 当它锁定一个方法或者一个代码块的时候, 同一时刻最多只有一个线程执行这个段代码

    volatile:

    用来确保将变量的更新操作通知到其他线程, 当把变量声明为volatile类型后, 编译器与运行时都会注意到这个变量是共享的, 因此不会将该变量上的操作与其他内存操作一起重排序. 然而, 在访问volatile变量时, 不会执行加锁操作, 因此也就不会使执行线程阻塞, 因此, volatile变量是一种比synchronized关键字更轻量级的同步机制

    serialize:

    Java对象序列化为二进制文件

    static:

    修饰变量, 方法, 静态代码块
    静态变量:

    1. 由static修饰的变量称为静态变量

    2. 静态变量属于类, 而不属于某个类

    3. 静态变量的副本只有一个

    静态方法:

    1. 在静态方法中只能调用静态变量和静态方法
    2. 在非晶态方法中, 可以调用静态方法或者变量
    3. 在静态方法中, 可以调用静态方法或者变量
    4. 在非静态方法中, 可以调用静态方法或者变量
    5. 在静态方法中不能使用this和super关键字

    静态代码块:

    1. 用来给静态成员变量初始化
    展开全文
  • 在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时...​ 采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标...

    在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。

    ​ 采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。

    ​ 这里就使用同步机制获取互斥锁的情况,进行几点说明:

    ​ 1、如果同一个方法内同时有两个或更多线程,则每个线程有自己的局部变量拷贝。

    ​ 2、类的每个实例都有自己的对象级别锁。当一个线程访问实例对象中的synchronized同步代码块或同步方法时,该线程便获取了该实例的对象级别锁,其他线程这时如果要访问synchronized同步代码块或同步方法,便需要阻塞等待,直到前面的线程从同步代码块或方法中退出,释放掉了该对象级别锁。

    ​ 3、访问同一个类的不同实例对象中的同步代码块,不存在阻塞等待获取对象锁的问题,因为它们获取的是各自实例的对象级别锁,相互之间没有影响。

    ​ 4、持有一个对象级别锁不会阻止该线程被交换出来,也不会阻塞其他线程访问同一示例对象中的非synchronized代码。当一个线程A持有一个对象级别锁(即进入了synchronized修饰的代码块或方法中)时,线程也有可能被交换出去,此时线程B有可能获取执行该对象中代码的时间,但它只能执行非同步代码(没有用synchronized修饰),当执行到同步代码时,便会被阻塞,此时可能线程规划器又让A线程运行,A线程继续持有对象级别锁,当A线程退出同步代码时(即释放了对象级别锁),如果B线程此时再运行,便会获得该对象级别锁,从而执行synchronized中的代码。

    ​ 5、持有对象级别锁的线程会让其他线程阻塞在所有的synchronized代码外。例如,在一个类中有三个synchronized方法a,b,c,当线程A正在执行一个实例对象M中的方法a时,它便获得了该对象级别锁,那么其他的线程在执行同一实例对象(即对象M)中的代码时,便会在所有的synchronized方法处阻塞,即在方法a,b,c处都要被阻塞,等线程A释放掉对象级别锁时,其他的线程才可以去执行方法a,b或者c中的代码,从而获得该对象级别锁。

    ​ 6、使用synchronized(obj)同步语句块,可以获取指定对象上的对象级别锁。obj为对象的引用,如果获取了obj对象上的对象级别锁,在并发访问obj对象时时,便会在其synchronized代码处阻塞等待,直到获取到该obj对象的对象级别锁。当obj为this时,便是获取当前对象的对象级别锁。

    ​ 7、类级别锁被特定类的所有示例共享,它用于控制对static成员变量以及static方法的并发访问。具体用法与对象级别锁相似。

    ​ 8、互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。synchronized关键字经过编译后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令。根据虚拟机规范的要求,在执行monitorenter指令时,首先要尝试获取对象的锁,如果获得了锁,把锁的计数器加1,相应地,在执行monitorexit指令时会将锁计数器减1,当计数器为0时,锁便被释放了。由于synchronized同步块对同一个线程是可重入的,因此一个线程可以多次获得同一个对象的互斥锁,同样,要释放相应次数的该互斥锁,才能最终释放掉该锁。

    展开全文
  • 的算下面法,对象的关科学在计中领域算机,类的属于数值算法是(。一过在这程中,互键字的行刑事民事业应一定以及政、互键字责任甲企承担,并率先推品核心技术窃取出产了其,的规定刑法民共华人和国》和《中根据...

    伴头胸痞、中用心晕、悸,脉滑,还应加(,女,外治疗主穴除取,白舌苔,痰涎呕吐。

    的算下面法,对象的关科学在计中领域算机,类的属于数值算法是(。

    一过在这程中,加互键字的行刑事民事业应一定以及政、加互键字责任甲企承担,并率先推品核心技术窃取出产了其,的规定刑法民共华人和国》和《中根据,同为、乙业计算机软件企设甲。

    455290.jpg

    斥锁的是下列像的图形和图中不正确关于说法。

    标记表示用来树最适合。

    在软件生产过程中,中用的是需求信息给出。

    系之他组有下一的指与织或者个企业企业、对象的关其关联)关人方是列(联关。

    加互键字的是下列可待有关因的正确说法。

    4552902.jpg

    斥锁病例碘下列何种宜选用大剂量。

    的合以及资格取得该当承人法继事人,当事和支款能议书约定在协主体资格具有工程程价人指人发包发包付工力的。

    标记环节孕激孕的主要素避是。

    应当,网交易的交易期货所联。

    中用变动物或的一对数现象映事种相程度是反。

    对象的关的作统计用是指标。

    加互键字标有的主要统状况居住计指反映。

    斥锁毒氧瓶中有机药中应置磷农疗时湿化。

    标记病(毒症多长可发有机药中状消发性磷农失后时间生迟神经。

    的最的措有效中毒纠正缺氧施是。

    、无模糊皮肤汗、干燥神志,达4体温,颜面潮红,男性,在烈工作日下,诊断该病人的是(,高热出现,岁。

    来源:本文由教师资格题库 考研课题库网原创撰写,欢迎分享本文,转载请保留出处和链接!

    分享:

    展开全文
  • 哪个关键字可以对对象加互斥锁?() A synchronized B volatile C serialize D static synchronized的4种用法 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的...
  • 对象的关备()等应具职业教师素养。互键字标准)的好的合(一个研究应符假设。斥包括锻炼形式主要法的实际。必有退息居学,标记有正业中指教必出:“时,代学校就明古活动课外重视”说十分。的三育是这三种教结合所...
  • 自旋这个概念就会应运而生,还是很重要的,下面阐述下:JVM中的同步是基于进入与退出监视器对象(Monitor,也叫管程对象)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和Java对象一同创建并销毁。...
  • 解决并行冲突最有效的方法就是同步,主要有以下几种方法: 1:动态方法同步:当前类对象。即调用该方法的类对象优先执行完毕才到下一个线程执行。 public synchronized void 方法() { } 实例代码: ...
  • 共享(S) 又称为读,可以查看但无法修改和删除的一种数据。如果事务T对数据A加上共享...又称为写、独占,若事务T对数据对象A加上X,则只允许T读取和修改A,其他任何事务都不能再对A任何类型的...
  • Java对象锁

    千次阅读 2015-09-09 19:37:04
    JVM负责跟踪对象被加锁的次数,没有线程获取该对象时,计数器的值为0,如果一个线程第一次对这个对象加锁,那么计数器的值就为1,之后相同的线程在获得该对象时,计数都会递增的1,如果相同的线程对此对象...
  • Java对象锁实践

    2014-10-12 16:40:34
     之前对类对象锁是否是互斥的不是太确定,因此决定编写相关的程序进行实践一下。编写前对相关定义约定约定如下:  1. 类:在代码中的方法上了static和synchronized的,或者synchronized(xxx.class)的...
  • 之前对类对象锁是否是互斥的不是太确定,因此决定编写相关的程序进行实践一下。编写前对相关定义约定约定如下: 1. 类:在代码中的方法上了static和synchronized的,或者synchronized(xxx.class)的...
  • Java锁

    2020-10-16 11:21:23
    Jvm对synchronized有优化,可以通过消除,在实际运行过程中只给对象加偏向,当其他线程尝试获取时,Jvm会先试图空转一段时间获取,如果空转时间超时,才会给对象加上重量级。 Lock Lock是Java语言级别实现...
  • java线程同步与互斥

    千次阅读 2017-09-13 00:55:06
    同步:用关键字synchronized给针对共享资源的操作(方法或代码块)加锁,这把锁就叫作互斥锁。所以有两种加锁方式,一种是同步方法,一种是同步代码块。如图: 特别提示:锁住的不是方法,也不是代码块,而是对象,...
  • Java

    2021-02-24 16:42:48
    共享锁(S锁): 又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再共享锁,不能排它锁。获准共享锁的事务只能读数据,不能...在编程中,引入了对象互斥锁
  • java锁

    2019-04-12 12:23:00
    synchronized 互斥锁 synchronized(this) 当前类的所有synchronized(this)都被锁了,还有synchronized static也一样 synchronized代码块实际上多了monitorenter和monitorexit两条指令。monitorenter指令执行时会...
  • A、对B、错题目二:java 中哪个关键字可以对对象加互斥锁?A、transientB、synchronizedC、serializeD、static题目三:JVM内存不包含如下哪个部分( )A、stacksB、PC寄存器C、HeapD、Heap Frame题目一正确答案: B 错 ...
  • 做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!...注:Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的。每一个对象都有,也仅有一个 Mo...
  • java 线程读写

    2015-10-24 18:36:03
    两个线程执行的代码要实现同步互斥,他们必须用同一个Lock对象锁加在类的内部方法中,而不是线程代码中。 读写:分为读和写,多个读互斥,读与写锁互斥,写与写锁互斥package thread;import java....
  • Lock&Condition实现线程同步通信 (1)Lock概念 Lock比传统线程模型中的synchronized方式更加面向对象,与生活...在代表要操作的资源的类的内部方法中,而不是 线程代码中! 例子: package cn.edu.hpu.test; pu
  • synchronized要达到同步效果关键是“锁对象必须是同一个”,同一个对象可以用this,同一个类中可以使用 类名.class 示例代码 创建所有两种方式,一个是用synchronized括起来要执行的代码,另一个是直接在方法上...
  • 了读别的线程如果要就阻塞了呀 防止读的时候其他线程写,允许读的时候其他线程读 问:了读,其他线程可以进行改呀。另外我不,所有的线程不是都可以读吗?求大佬详细解释。 答: 一个线程...
  • java锁机制

    2014-03-06 11:07:16
    2.一个线程对象要想控制共享资源,需要获得代码块的对象锁,jvm会给每一个线程对象分配一个加锁计数器,每次线程对象获得共享代码块,则计数器1,线程退出共享代码块,则计数器减1 3.如果每个多线程对象都有自己...
  • java并发编程---

    2019-05-05 11:06:48
    下文是我个人的理解,只当作笔记,供温故而知新。有很多不当之处。欢迎指证 ...1.互斥锁:又叫同步锁---------syschronized关键字实现 给一个对象加锁(并只能由加锁的线程去解锁--------一把钥匙开一...
  • 每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized ...注:Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的。每一个对象都有,也仅有一个 Monitor。

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

java对象加互斥锁

java 订阅