返回
沈阳市和平区爱尚职业
置顶
招生热线:400-800-2178

学校地址:沈阳市中山路349号

Synchronized 关键字

42 2018-06-28 09:11:07

学习笔记

  在爱尚沈阳java培训学习java编程中,经常需要用到同步,而用得多的也许是synchronized关键字了,下面爱尚沈阳java培训老师带你看看这个关键字的用法。

  synchronized只是一个内置锁的加锁机制,当某个方法加上synchronized关键字后,就表明要获得该内置锁才能执行,并不能阻止其他线程访问不需要获得该内置锁的方法。

  把synchronized当作函数修饰符时,示例代码如下:

  Public synchronized void method(){

  //….

  }

  这也就是同步方法,那这时synchronized锁定的是哪个对象呢?他锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。下面就和爱尚沈阳java培训的老师看看到底要怎么用用吧。

  上边的示例代码等同于如下代码:

  public void method()

  {

  synchronized (this) // (1)

  {

  //…..

  }

  }

  (1)处的this指的是什么呢?他指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。

  区分 synchronized (this) 与 synchronized (Class.class)

  public class Test {

  private static class Counter {

  public void count() {

  synchronized (this){

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

  try {

  Thread.sleep(3000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

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

  }

  }

  public void doOtherThings(){

  synchronized (Counter.class){

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

  }

  }

  }

  public static void main(String[] var0) {

  final Counter counter = new Counter();

  new Thread(new Runnable() {

  @Override

  public void run() {

  counter.count();

  }

  }).start();

  new Thread(new Runnable() {

  @Override

  public void run() {

  counter.doOtherThings();

  }

  }).start();

  }

  }


文中图片素材来源网络,如有侵权请联系删除
来源:沈阳市和平区爱尚职业培训机构

免费提供问答解答,帮您轻松解决难题

热门课程 全部课程

热门动态

申请免费试听

只要一个电话

我们为您免费回电

立即申请
刷新
图形验证
关闭
>>
拖动左边滑块完成上方拼图