iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java Thread应该注意的问题有哪些
  • 727
分享到

Java Thread应该注意的问题有哪些

2023-06-03 03:06:24 727人浏览 薄情痞子
摘要

这篇文章给大家介绍Java Thread应该注意的问题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java Thread应该注意的问题(wang hailong)XML:namespace prefix = o

这篇文章给大家介绍Java Thread应该注意的问题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Java Thread应该注意的问题

(wang hailong)

XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

Java的线程编程非常简单。但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。

1.同步对象的恒定性

All java objects are references.

对于局部变量和参数来说,java里面的int, float, double, boolean等基本数据类型,都在栈上。这些基本类型是无法同步的;java里面的对象(根对象是Object),全都在堆里,指向对象的reference在栈上。

java中的同步对象,实际上是对于reference所指的“对象地址”进行同步。
需要注意的问题是,千万不要对同步对象重新赋值。举个例子。
class A implements Runnable{
  Object lock = new Object();

void run(){
  for(...){
    synchronized(lock){
      // do something
      ...
      lock = new Object();
    }
  }
}

run函数里面的这段同步代码实际上是毫无意义的。因为每一次lock都给重新分配了新的对象的reference,每个线程都在新的reference同步。
大家可能觉得奇怪,怎么会举这么一个例子。因为我见过这样的代码,同步对象在其它的函数里被重新赋了新值。
这种问题很难查出来。
所以,一般应该把同步对象声明为final.
final Object lock = new Object();

使用Singleton Pattern 设计模式来获取同步对象,也是一种很好的选择。

2.如何放置共享数据

实现线程,有两种方法,一种是继承Thread类,一种是实现Runnable接口。

上面举的例子,采用实现Runnable接口的方法。本文推荐这种方法。

首先,把需要共享的数据放在一个实现Runnable接口的类里面,然后,把这个类的实例传给多个Thread的构造方法。这样,新创建的多个Thread,都共同拥有一个Runnable实例,共享同一份数据。

如果采用继承Thread类的方法,就只好使用static静态成员了。如果共享的数据比较多,就需要大量的static静态成员,令程序数据结构混乱,难以扩展。这种情况应该尽量避免。

编写一段多线程代码,处理一个稍微复杂点的问题。两种方法的优劣,一试便知。

3.同步的粒度

线程同步的粒度越小越好,即,线程同步的代码块越小越好。尽量避免用synchronized修饰符来声明方法。尽量使用synchronized(anObject)的方式,如果不想引入新的同步对象,使用synchronized(this)的方式。而且,synchronized代码块越小越好。

4.线程之间的通知

这里使用“通知”这个词,而不用“通信”这个词,是为了避免词义的扩大化。

线程之间的通知,通过Object对象的wait()和notify() 或notifyAll() 方法实现。

下面用一个例子,来说明其工作原理:

假设有两个线程,A和B。共同拥有一个同步对象,lock。

1.首先,线程A通过synchronized(lock) 获得lock同步对象,然后调用lock.wait()函数,放弃lock同步对象,线程A停止运行,进入等待队列。

2.线程B通过synchronized(lock) 获得线程A放弃的lock同步对象,做完一定的处理,然后调用 lock.notify() 或者lock.notifyAll() 通知等待队列里面的线程A。

3.线程A从等待队列里面出来,进入ready队列,等待调度。

4.线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。

5.线程A获得lock同步对象,继续运行。

例子代码如下:

public class SharedResource implements Runnable{

  Object lock = new Object();

  public void run(){

  // 获取当前线程的名称。

  String threadName = Thread.currentThread().getName();

  if( “A”.equals(threadName)){

  synchronized(lock){ //线程A通过synchronized(lock) 获得lock同步对象

  try{

  System.out.println(“ A gives up lock.”);

  lock.wait(); // 调用lock.wait()函数,放弃lock同步对象,

// 线程A停止运行,进入等待队列。

   }catch(InterruptedException e){

  }

  // 线程A重新获得lock同步对象之后,继续运行。

  System.out.println(“ A Got lock again and continue to run.”);

    } // end of synchronized(lock)

  }

  if( “B”.equals(threadName)){

  synchronized(lock){//线程B通过synchronized(lock) 获得线程A放弃的lock同步对象

   System.out.println(“B got lock.”);

  lock.notify(); //通知等待队列里面的线程A,进入ready队列,等待调度。

  //线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。

   System.out.println(“B gives up lock.”);

    } // end of synchronized(lock)

  boolean hasLock = Thread.holdsLock(lock); // 检查B是否拥有lock同步对象。

  System.out.println(“B has lock ? -- ” +hasLock); // false.

  }

  }

}

public class TestMain{

  public static void main(){

  Runnable resource = new SharedResource();

  Thread A = new Thread(resource,”A”);

  A.start();

  // 强迫主线程停止运行,以便线程A开始运行。

  try {

   Thread.sleep(500);

  }catch(InterruptedException e){

  }

  Thread B = new Thread(resource,”B”);

  B.start();

  }

}

5.跨类的同步对象

对于简单的问题,可以把访问共享资源的同步代码都放在一个类里面。

但是对于复杂的问题,我们需要把问题分为几个部分来处理,需要几个不同的类来处理问题。这时,就需要在不同的类中,共享同步对象。比如,在生产者和消费者之间共享同步对象,在读者和写者之间共享同步对象。

如何在不同的类中,共享同步对象。有几种方法实现,

(1)前面讲过的方法,使用static静态成员,(或者使用Singleton Pattern.)

(2)用参数传递的方法,把同步对象传递给不同的类。

(3)利用字符串常量的“原子性”。

对于第三种方法,这里做一下解释。一般来说,程序代码中的字符串常量经过编译之后,都具有唯一性,即,内存中不会存在两份相同的字符串常量。

(通常情况下,c++C语言程序编译之后,也具有同样的特性。)

比如,我们有如下代码。

String A = “atom”;

String B = “atom”;

我们有理由认为,A和B指向同一个字符串常量。即,A==B。

注意,声明字符串变量的代码,不符合上面的规则。

String C= new String(“atom”);

String D = new String(“atom”);

这里的C和D的声明是字符串变量的声明,所以,C != D。

有了上述的认识,我们就可以使用字符串常量作为同步对象。

比如我们在不同的类中,使用synchronized(“myLock”), “myLock”.wait(),“myLock”.notify(), 这样的代码,就能够实现不同类之间的线程同步。

小编并不强烈推荐这种用法,只是说明,有这样一种方法存在。

推荐第二种方法,(2)用参数传递的方法,把同步对象传递给不同的类。

关于Java Thread应该注意的问题有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java Thread应该注意的问题有哪些

本文链接: https://www.lsjlt.com/news/232458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Thread应该注意的问题有哪些
    这篇文章给大家介绍Java Thread应该注意的问题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java Thread应该注意的问题(wang hailong)XML:namespace prefix = o...
    99+
    2023-06-03
  • java swt应该注意的问题有哪些
    这篇文章主要讲解了“java swt应该注意的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java swt应该注意的问题有哪些”吧!InstallAnywhere 要注...
    99+
    2023-06-03
  • Java打包JavaScript路径时应该注意哪些问题?
    在Java应用程序中,JavaScript是一个非常重要的组成部分,可以帮助我们实现各种功能。但是,在打包JavaScript路径时,可能会遇到一些问题。在本文中,我们将探讨在Java中打包JavaScript路径时应该注意哪些问题,以及...
    99+
    2023-09-10
    打包 javascript path
  • 使用FlexaddChild()方法时应该注意的问题有哪些
    小编给大家分享一下使用FlexaddChild()方法时应该注意的问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!FlexaddChild()方法注意事项在FlexApplication里,是不能直接用Flexad...
    99+
    2023-06-17
  • DIV高度自适应以及应该注意的问题有哪些
    本篇文章给大家分享的是有关DIV高度自适应以及应该注意的问题有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。和大家重点讨论一下DIV高度自...
    99+
    2022-10-19
  • 选择代理IP应该注意哪些问题
    本篇内容介绍了“选择代理IP应该注意哪些问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对于我们来说,网络IP软件并不陌生,因为我们每天都...
    99+
    2023-06-20
  • 服务器租用应该注意哪些问题
    服务器租用应该注意的问题有:1、注意服务器的速度与稳定性,租用前对服务器进行测试;2、注意服务器的售后和问题处理速度,看是否能提供24小时全天候服务;3、注意服务器所具备的功能,包括空间的大小,流量多少,所支持的数据库等。具体内容如下:服务...
    99+
    2022-10-05
  • 老域名使用应该注意哪些问题
    老域名使用应该注意的问题有:1、注意老域名外链是否会对做新站有影响,分析发布的外链属于垃圾外链、作弊外链、还是相关性好链接;2、注意老域名的外链是否会对新站发展有影响,如是垃圾外链,百度过滤掉,对网站没有影响;3、注意看网站上线20天后有没...
    99+
    2022-10-07
  • 美国服务器托管应该注意的问题有哪些
    美国服务器托管应该注意的问题有:1、需要选择信誉高、安全可靠的品牌机房服务商进行托管,保障服务器能够不间断正常运行;2、需要根据用户群体的所在区域选择较近的机房进行服务器托管,从而保障用户能够流畅的访问网站业务;3、需要理性的看待美国服务器...
    99+
    2022-10-16
  • hashMap扩容时应该注意的死循环问题有哪些
    小编给大家分享一下hashMap扩容时应该注意的死循环问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hashMap死循环原因: jdk1.7时使用头插入...
    99+
    2023-06-15
  • Java需要注意的问题有哪些
    这篇文章主要介绍了Java需要注意的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Top 1:"abc"=="abc"返回的...
    99+
    2023-06-17
  • 更换dns服务器应该注意哪些问题
    本篇内容主要讲解“更换dns服务器应该注意哪些问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“更换dns服务器应该注意哪些问题”吧! 更换服务器对于优化网站来说是一件“大事”,它直接...
    99+
    2023-06-07
  • 制作404错误页面时有哪些应该注意的问题
    这篇文章主要介绍“制作404错误页面时有哪些应该注意的问题”,在日常操作中,相信很多人在制作404错误页面时有哪些应该注意的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”制作404错误页面时有哪些应该注意...
    99+
    2023-06-08
  • 选择日本云服务器应该注意的问题有哪些
    选择日本云服务器应该注意的问题有:1、注意提供日本云服务器的服务商是否具备IDC、ICP、ISP三证及云服务器牌照;2注意日本云服务器的机房实力是否较强;3、注意日本云服务器的售后服务是否提供全天候24*7小时的技术支持服务;4、注意日本云...
    99+
    2022-10-12
  • 制作404错误页面时应该注意的问题有哪些
    本篇文章为大家展示了制作404错误页面时应该注意的问题有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在做网站优化时我们要学会利用错误页面,例如我们网站可能出现的404错误页面,下面就给大家讲一...
    99+
    2023-06-10
  • Java Map应该掌握的问题有哪些
    这篇文章主要介绍“Java Map应该掌握的问题有哪些”,在日常操作中,相信很多人在Java Map应该掌握的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java Map应该掌握的问题有哪些”的疑...
    99+
    2023-06-16
  • Java中应该搞懂的问题有哪些
    本篇内容介绍了“Java中应该搞懂的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题一:我声明了什么!String s = &q...
    99+
    2023-06-03
  • 租用国外服务器应该注意哪些问题
    租用国外服务器应该注意的问题:1、需要根据自身的实际情况选择服务器的操作系统;2、需要注意低价格的服务器,避免选择到劣质产品,从而上当受骗,因此要注重服务器整体的性价比;3、需要根据自身业务需求按需合理选择服务器配置方案,从而保障网站业务能...
    99+
    2022-10-20
  • 站群服务器选择应该注意哪些问题
    站群服务器选择应该注意的问题有:1、注意服务器的稳定性,以保证网站的优化;2、注意服务器的安全性,以保证能抵挡恶意攻击和恶意入侵等;3、注意服务器的速度,以保证网站的访问速度;4、注意服务器的售后服务质量,以保证能及时解决售后问题。具体内容...
    99+
    2022-10-13
  • 香港服务器应该注意哪些安全问题
    香港服务器应该注意的安全问题:1、DDOS流量攻击,需要做好香港服务器对DDOS攻击的防御措施,实时监测网络运行情况,从而提高服务器稳定性;2、不要随意下载未知来源的软件程序,因为它有可能是带有病毒的恶意软件;3、需要加强香港服务器管理账号...
    99+
    2022-10-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作