「java多线程靠谱吗」java多线程可以做什么
本篇文章给大家谈谈java多线程靠谱吗,以及java多线程可以做什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java是线程安全的吗
- 2、java 多线程问题 真的提高了效率吗?
- 3、java使用多线程有什么用?或者说有什么优势?与不用有什么区别?
- 4、Java+线程内部调用实例方法会多线程安全吗?
- 5、java多线程编程核心技术怎么样
java是线程安全的吗
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTab;le)
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)
概念:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
例子:
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B
得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0
(注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加
Size 的值。
那好,我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
安全性:
线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,因为java会有相应的机制是同一时刻只有一个线程对这个变量操作。并且
Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector
被其他线程修改,那么由 Vector.iterator() 返回的
iterator会抛出ConcurrentModifiicationException)。
对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。
Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性
– 各类之间的界线不是百分之百地明确,而且有些情况它没照顾到 –
但是这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。
不可变
不可变的对象一定是线程安全的,并且永远也不需要额外的同步。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java
类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都是不可变的。
需要注意的是,对于Integer,该类不提供add方法,加法是使用+来直接操作。而+操作是不具线程安全的。这是提供原子操作类AtomicInteger的原。
线程安全
线程安全的对象具有在上面“线程安全”一节中描述的属性 –
由类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排线程都不需要任何额外的同步。这种线程安全性保证是很严格的 –
许多类,如 Hashtable 或者 Vector 都不能满足这种严格的定义。
有条件的线程安全
有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable
或者 Vector 或者返回的迭代器 – 由这些类返回的 fail-fast
迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的
– 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic monitor))。
如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。
线程兼容
线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized
块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList()
一样)。也可能意味着用 synchronized
块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。
许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。
线程对立
线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。
java 多线程问题 真的提高了效率吗?
你钻了牛角尖了。不要从cpu耗时上看,并行一般是为了任务处理。并发是为了资源共享和资源的充分利用。二者可比性不大。
你所说的cpu一般是指,分时系统中的cpu,比如linux,其中一个用户A的一个线程要30个小时完成,另外一个用户B的线程需要1000个小时。而且其中需要用户不断响应,如果没有并发,B用户先开始,A用户需要等待1030小时。如果使用并发,A用户可能四五十个小时就搞定了。如果A和B都比较有money,一人买一台,没有这个问题的。这就是并行。资源充足怎么着都行,资源不足只能找折中方案了。
如果你觉得这是进程的概念,java里一样的。你做过web开发吧。你肯定不想每个请求都分一个服务器吧。开发一个网页,一台电脑同时有上千个人访问你的tomcat,一般不会有问题。浏览也顺畅。这就是并发的作用。这种情况如果使用单线程。一千个人有999个人等着看你的网页,而第一个人操作的时候cpu大部分时间是空闲的。怎么利用起来就成了个问题。这也叫效率。
如果确实必须要考虑问题处理的效率问题。你访问数据库的时候用过线程池吗?是不是能缩短访问数据库所耗费的时间。所以效率高不高不能只看cpu用了多少时间。你可以再考虑考虑,不用多线程,你怎么设计一个单线程程序,同时监听键盘和麦克风的信息录入?
其实计算机底层是有天然的异步特性的。这个东西就是中断。有些耗时的io操作,什么时候处理完是可以不用管的。剩下的无关线程就可以自由自在的进行了。这样效率是不是也高了。
单cpu一般也是多核的。
java使用多线程有什么用?或者说有什么优势?与不用有什么区别?
多线程对于操作一些响应时间差异太大的情况经常有用。
比如通讯设备网络IO、蓝牙。比如存储设备、磁盘、U盘、光盘。显示、绘图。又比如不同窗口、不同任务、不同用户、不同指令、不同消息之间的响应差异是巨大的。如果单线程处理这些情况,等待时间会很长,甚至无法进行、死机。
虽然unix的哲学强调“线程很邪恶”,因为unix用“进程”解决这些情况。但java本身就是一个比较完善平台,所以java提供的线程是很有用的。没有java是个完善平台的前提,线程还是很邪恶的。
设备相关的操作,有响应差异的、实时的、异步、同步的、多任务,都离不开多线程,
线程属于java并行编程的基础。
Java+线程内部调用实例方法会多线程安全吗?
Java中线程内部调用实例方法时,其线程安全性取决于该实例方法是否是线程安全的。如果实例方法经过正确设计和实现,确保不会出现竞态条件(race condition)和数据竞争(data race),则它也是线程安全的,线程内部调用时不会出现多线程安全问题。
然而,如果实例方法没有考虑到多线程并发访问的问题,没有采取相应的同步机制或使用了不安全的共享变量等方式,就会存在多线程安全问题。同时,即使实例方法是线程安全的,如果它在操作共享资源时没有配合使用相应的同步机制,也会导致多线程不安全。
综上,Java中线程内部调用实例方法的多线程安全性取决于实例方法本身的线程安全性和相应的同步机制的正确使用。
java多线程编程核心技术怎么样
java多线程核心技术挺好的。
线程可以理解为是在进程中独立运行的子任务。
Java多线程
使用方法
Java中实现多线程主要有以下两种方法:
继承Thread,而后实例化该对象调用start()即启动了新线程;
实现Runnable,通过new Thread(Runnable run)实例化该线程,而后调用start()
关于java多线程靠谱吗和java多线程可以做什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。