欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

java語(yǔ)言

Java多線(xiàn)程常用的幾個(gè)關(guān)鍵字

時(shí)間:2025-05-01 07:36:30 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

Java多線(xiàn)程常用的幾個(gè)關(guān)鍵字

  本文是百分網(wǎng)小編搜索整理的關(guān)于Java多線(xiàn)程常用的幾個(gè)關(guān)鍵字,供參考借鑒,希望對(duì)大家有所幫助!想了解更多相關(guān)信息請(qǐng)持續(xù)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!

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

  1、同步(synchronized)簡(jiǎn)單說(shuō)可以理解為共享的意思,如果資源不是共享的,就沒(méi)必要進(jìn)行同步。設(shè)置共享資源為同步的話(huà),可以避免一些臟讀情況。

  2、異步(asynchronized)簡(jiǎn)單說(shuō)可以理解為獨(dú)立不受到其他任何制約。

  舉個(gè)例子:

  線(xiàn)程1調(diào)用了帶有synchronized關(guān)鍵字的方法methodA,線(xiàn)程2調(diào)用了異步方法methodB,出現(xiàn)的現(xiàn)象是同時(shí)控制臺(tái)輸出 t1,t2。

  package com.ietree.multithread.sync;

  /**

  * 多線(xiàn)程之對(duì)象同步鎖和異步鎖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());

  }

  }

  線(xiàn)程1調(diào)用了帶有synchronized關(guān)鍵字的方法methodA,線(xiàn)程2調(diào)用了帶有synchronized關(guān)鍵字的方法methodB,出現(xiàn)的現(xiàn)象是首先輸出t1,等待4秒之后再輸出t2。

  package com.ietree.multithread.sync;

  /**

  * 多線(xiàn)程之對(duì)象同步鎖和異步鎖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());

  }

  }

  結(jié)論:

  在第一段代碼中t1線(xiàn)程先持有object對(duì)象的Lock鎖,t2線(xiàn)程可以以異步的方式調(diào)用對(duì)象中的非synchronized修飾的方法,所以同時(shí)輸出;

  在第二段代碼中t1線(xiàn)程先持有object對(duì)象的Lock鎖,t2線(xiàn)程如果在這個(gè)時(shí)候調(diào)用對(duì)象中的同步(synchronized)方法則需等待,也就是同步。

  二、volatile

  作用:volatile關(guān)鍵字的作用是:使變量在多個(gè)線(xiàn)程間可見(jiàn)(具有可見(jiàn)性),但是僅靠volatile是不能保證線(xiàn)程的安全性,volatile關(guān)鍵字不具備synchronized關(guān)鍵字的原子性。

  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("進(jìn)入run方法..");

  int i = 0;

  while (isRunning == true) {

  // ..

  }

  System.out.println("線(xiàn)程停止");

  }

  public static void main(String[] args) throws InterruptedException {

  RunThread rt = new RunThread();

  rt.start();

  Thread.sleep(1000);

  rt.setRunning(false);

  System.out.println("isRunning的值已經(jīng)被設(shè)置了false");

  }

  }

  程序輸出:

  進(jìn)入run方法..

  isRunning的值已經(jīng)被設(shè)置了false

  之后進(jìn)入死循環(huán)

  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("進(jìn)入run方法..");

  int i = 0;

  while (isRunning == true) {

  // ..

  }

  System.out.println("線(xiàn)程停止");

  }

  public static void main(String[] args) throws InterruptedException {

  RunThread rt = new RunThread();

  rt.start();

  Thread.sleep(1000);

  rt.setRunning(false);

  System.out.println("isRunning的值已經(jīng)被設(shè)置了false");

  }

  }

  程序輸出:

  isRunning的值已經(jīng)被設(shè)置了false

  線(xiàn)程停止

  總結(jié):當(dāng)多個(gè)線(xiàn)程之間需要根據(jù)某個(gè)條件確定 哪個(gè)線(xiàn)程可以執(zhí)行時(shí),要確保這個(gè)條件在 線(xiàn)程之間是可見(jiàn)的。因此,可以用volatile修飾。

  volatile 與 synchronized 的比較:

 、賤olatile輕量級(jí),只能修飾變量。synchronized重量級(jí),還可修飾方法

 、趘olatile只能保證數(shù)據(jù)的可見(jiàn)性,不能用來(lái)同步,因?yàn)槎鄠(gè)線(xiàn)程并發(fā)訪(fǎng)問(wèn)volatile修飾的變量不會(huì)阻塞。

  synchronized不僅保證可見(jiàn)性,而且還保證原子性,因?yàn)椋挥蝎@得了鎖的線(xiàn)程才能進(jìn)入臨界區(qū),從而保證臨界區(qū)中的所有語(yǔ)句都全部執(zhí)行。多個(gè)線(xiàn)程爭(zhēng)搶synchronized鎖對(duì)象時(shí),會(huì)出現(xiàn)阻塞。

  線(xiàn)程安全性包括兩個(gè)方面,①可見(jiàn)性。②原子性。

  從上面自增的例子中可以看出:僅僅使用volatile并不能保證線(xiàn)程安全性。而synchronized則可實(shí)現(xiàn)線(xiàn)程的安全性。

【Java多線(xiàn)程常用的幾個(gè)關(guān)鍵字】相關(guān)文章:

Java 多線(xiàn)程之synchronized關(guān)鍵字詳解10-04

java的多線(xiàn)程09-09

java多線(xiàn)程08-31

java語(yǔ)言的多線(xiàn)程08-29

java多線(xiàn)程介紹08-23

java多線(xiàn)程教程11-03

如何使用java多線(xiàn)程08-23

Java多線(xiàn)程問(wèn)題總結(jié)10-24

Java使用多線(xiàn)程的優(yōu)勢(shì)07-10