全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详谈Java多线程的几个常用关键字

一、同步(synchronized)和异步(asynchronized)

1、同步(synchronized)简单说可以理解为共享的意思,如果资源不是共享的,就没必要进行同步。设置共享资源为同步的话,可以避免一些脏读情况。

2、异步(asynchronized)简单说可以理解为独立不受到其他任何制约。

举个例子:

线程1调用了带有synchronized关键字的方法methodA,线程2调用了异步方法methodB,出现的现象是同时控制台输出 t1,t2。

package com.ietree.multithread.sync;

/**
 * 多线程之对象同步锁和异步锁Demo
 *
 * @author ietree
 */
public class SynAndAsynDemo {

  public static void main(String[] args) {
    
    final SynAndAsynDemo mo = new SynAndAsynDemo();
    
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodA();
      }
    },"t1");
    
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodB();
      }
    },"t2");
    
    t1.start();
    t2.start();
  }
  
  // 方法A
  public synchronized void methodA(){
    try {
      System.out.println(Thread.currentThread().getName());
      // 休眠4秒
      Thread.sleep(4000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  // 方法B
  public void methodB(){
    System.out.println(Thread.currentThread().getName());
  }
  
}

线程1调用了带有synchronized关键字的方法methodA,线程2调用了带有synchronized关键字的方法methodB,出现的现象是首先输出t1,等待4秒之后再输出t2。

package com.ietree.multithread.sync;

/**
 * 多线程之对象同步锁和异步锁Demo
 *
 * @author ietree
 */
public class SynAndAsynDemo {

  public static void main(String[] args) {
    
    final SynAndAsynDemo mo = new SynAndAsynDemo();
    
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodA();
      }
    },"t1");
    
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodB();
      }
    },"t2");
    
    t1.start();
    t2.start();
  }
  
  // 方法A
  public synchronized void methodA(){
    try {
      System.out.println(Thread.currentThread().getName());
      // 休眠4秒
      Thread.sleep(4000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  // 方法B
  public synchronized void methodB(){
    System.out.println(Thread.currentThread().getName());
  }
  
}

结论:

在第一段代码中t1线程先持有object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法,所以同时输出;

在第二段代码中t1线程先持有object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待,也就是同步。

二、volatile

作用:volatile关键字的作用是:使变量在多个线程间可见(具有可见性),但是仅靠volatile是不能保证线程的安全性,volatile关键字不具备synchronized关键字的原子性。

Demo1:

package com.ietree.multithread.sync;

public class RunThread extends Thread {
  // volatile
  private boolean isRunning = true;

  private void setRunning(boolean isRunning) {
    this.isRunning = isRunning;
  }

  public void run() {
    System.out.println("进入run方法..");
    int i = 0;
    while (isRunning == true) {
      // ..
    }
    System.out.println("线程停止");
  }

  public static void main(String[] args) throws InterruptedException {
    RunThread rt = new RunThread();
    rt.start();
    Thread.sleep(1000);
    rt.setRunning(false);
    System.out.println("isRunning的值已经被设置了false");
  }
}

程序输出:

进入run方法..
isRunning的值已经被设置了false

之后进入死循环

Demo2:

package com.ietree.multithread.sync;

public class RunThread extends Thread {
  // volatile
  private volatile boolean isRunning = true;

  private void setRunning(boolean isRunning) {
    this.isRunning = isRunning;
  }

  public void run() {
    System.out.println("进入run方法..");
    int i = 0;
    while (isRunning == true) {
      // ..
    }
    System.out.println("线程停止");
  }

  public static void main(String[] args) throws InterruptedException {
    RunThread rt = new RunThread();
    rt.start();
    Thread.sleep(1000);
    rt.setRunning(false);
    System.out.println("isRunning的值已经被设置了false");
  }
}

程序输出:

isRunning的值已经被设置了false
线程停止

总结:当多个线程之间需要根据某个条件确定 哪个线程可以执行时,要确保这个条件在 线程之间是可见的。因此,可以用volatile修饰。

volatile 与 synchronized 的比较:

①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法

②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

线程安全性包括两个方面,①可见性。②原子性。

从上面自增的例子中可以看出:仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

以上这篇详谈Java多线程的几个常用关键字就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# java多线程关键字  # Java中volatile关键字的作用与用法详解  # 谈谈Java中Volatile关键字的理解  # 详解Java线程编程中的volatile关键字的作用  # java 中newInstance()方法和new关键字的区别  # Java关键字volatile和synchronized作用和区别  # Java中Volatile关键字详解及代码示例  # 多个  # 见性  # 多线程  # 给大家  # 象中  # 几个  # 在这个  # 可以用  # 就没  # 希望能  # 可以看出  # 还可  # 这篇  # 并不能  # 则可  # 不具备  # 小编  # 两个方面  # 大家多多  # 举个例子 


相关文章: 如何高效配置香港服务器实现快速建站?  C#怎么使用委托和事件 C# delegate与event编程方法  定制建站如何定义?其核心优势是什么?  建站VPS能否同时实现高效与安全翻墙?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在VPS电脑上快速搭建网站?  如何通过可视化优化提升建站效果?  5种Android数据存储方式汇总  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  岳西云建站教程与模板下载_一站式快速建站系统操作指南  宝塔新建站点报错如何解决?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  已有域名和空间如何快速搭建网站?  如何在腾讯云服务器快速搭建个人网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何选择高效可靠的多用户建站源码资源?  建站三合一如何选?哪家性价比更高?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何彻底卸载建站之星软件?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  网站图片在线制作软件,怎么在图片上做链接?  如何在搬瓦工VPS快速搭建网站?  如何配置IIS站点权限与局域网访问?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站主机核心功能解析:服务器选择与网站搭建流程指南  文字头像制作网站推荐软件,醒图能自动配文字吗?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何确保西部建站助手FTP传输的安全性?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  红河网站制作公司,红河事业单位身份证如何上传?  独立制作一个网站多少钱,建立网站需要花多少钱?  建站主机如何安装配置?新手必看操作指南  如何选择适配移动端的WAP自助建站平台?  在线教育网站制作平台,山西立德教育官网?  网站制作说明怎么写,简述网页设计的流程并说明原因?  建站主机功能解析:服务器选择与快速搭建指南  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  建站之星多图banner生成与模板自定义指南  如何快速打造个性化非模板自助建站?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何快速搭建高效香港服务器网站?  已有域名如何免费搭建网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  中山网站推广排名,中山信息港登录入口?  建站之家VIP精选网站模板与SEO优化教程整合指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。