您的位置:

java线程并发,java线程并发处理

本文目录一览:

java多线程并发的问题

回答这个问题需要先弄清楚线程的概念和线程的生命周期。

线程:是指程序代码的一次执行,是动态的过程。楼主在定义OneTh这个实现Runnable接口类的时候肯定复写了他的run()方法。onet1和onet2是两个线程,也就是说虽然他们的run()方法相同,但是是执行了两次的。

计算机中CPU的调度过程:现在的电脑看上去能同时实现多任务,像是一边上QQ,一边听音乐,还可以一边上网。但计算机中的CPU只有一个,它没有分身术,不可能真正意义上实现同时运行这么多程序。而是采用了一种时间片轮转的方式,为每个应用程序赋予极短的时间,然后高速的在不同的程序间切换,至于每次切换到那个程序,这个要由CPU和线程的优先级来决定。

线程的生命周期:创建时是初始化了这个线程,调用start方法时,是让这个线程进入了可运行状态,注意是可运行,不是正在运行。就像上面说的,在某一时刻CPU具体要运行谁是由CPU和线程的优先级决定的。当线程被CPU运行时,就会开始执行run方法,但可能执行到一半时,CPU又被其他可运行线程抢走,而只能暂停执行。

JAVA程序线程的运行:在我们使用java命令来运行程序时,这时候已经开始了两个线程,一个是main()方法的线程,一个是垃圾回收的线程。当楼主调用start方法开启另外两个线程时。这时候由于CPU来决定运行哪个线程。所以虽然noet1是先开启的,但在执行noet1时,CPU可能又去跑去执行main线程了,然后就会开启onet2.

还有我觉得主线程结束了,只不过其他两个线程仍在继续运行。所以会打印出结果。

楼主如果还有什么不明白的话可以继续问或者相互讨论。

北大青鸟设计培训:Java并发编程:核心理论?

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。

它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。

电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。

在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源码及其背后的原理。

本文是该系列的第一篇文章,是这系列中最核心的理论部分,之后的文章都会以此为基础来分析和解释。

关于java并发编程及实现原理,还可以查阅《Java并发编程:Synchronized及其实现原理》。

一、共享性数据共享性是线程安全的主要原因之一。

如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。

但是,在多线程编程中,数据共享是不可避免的。

最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本。

我们现在,通过一个简单的示例来演示多线程下共享数据导致的问题。

二、互斥性资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。

我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。

所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。

如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。

例如,对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。

但是对共享数据的写操作,一般就需要保证互斥性,上述例子中就是因为没有保证互斥性才导致数据的修改产生问题。

java多线程并发问题怎么解决

java多线程并发问题产生的主要原因是多个线程访问一个实例,导致其中一个线程修改或删除这个实例时,其他线程产生并发问题。

要解决这种并发问题有两种方法:

(1)加上线程锁synchronization

(2)还有个不是办法的办法:不用成员变量,用局部变量

如何判断 Java 线程并发的安全性

总的结论:java是线程安全的,即对任何方法(包括静态方法)都可以不考虑线程冲突,但有一个前提,就是不能存在全局变量。如果存在全局变量,则需要使用同步机制。

如下通过一组对比例子从头讲解:

在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题?

public class Test {

public static void operation(){

// ... do something

}

}

事实证明只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题。下面看一个例子:

public class StaticThread implements Runnable {

@Override

public void run() {

// TODO Auto-generated method stub

StaticAction.print();

}

public static void main(String[] args) {

for (int i = 0; i 100; i++) {

new Thread(new StaticThread()).start();

}

}

}

public class StaticAction {

public static int i = 0;

public static void print() {

int sum = 0;

for (int i = 0; i 10; i++) {

System.out.print("step " + i + " is running.");

sum += i;

}

if (sum != 45) {

System.out.println("Thread error!");

System.exit(0);

}

System.out.println("sum is " + sum);

java并发(1)线程模型

程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念

主要归咎于两点. 一个是由实现决定的,一个是由需求决定的.

线程由线程ID,程序计数器(PC)[用于指向内存中的程序指令],寄存器集合[由于存放本地变量和临时变量]和堆栈[用于存放方法指令和方法参数等]组成。

以 Unix/Linux 的体系架构为例。

因为操作系统的资源是有限的,如果访问资源的操作过多,必然会消耗过多的资源,而且如果不对这些操作加以区分,很可能造成资源访问的冲突。所以,为了减少有限资源的访问和使用冲突,对不同的操作赋予不同的执行等级(有多大能力做多大的事),用户态(User Mode)和内核态(Kernel Mode)。

运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制。

并发 :一个时间段内有很多的线程或进程在执行,但何时间点上都只有一个在执行,多个线程或进程争抢时间片轮流执行。

并行 :一个时间段和时间点上都有多个线程或进程在执行。

线程有三种模型, 一对一,多对一,多对多.具体参考 一篇文章读懂Java多线程模型 , 这里只描述一对一的情况.

每个用户线程都映射到一个内核线程,每个线程都成为一个独立的调度单元,由内核调度器独立调度,一个线程的阻塞不会影响到其他线程,从而保障整个进程继续工作.

JVM 没有限定 Java 线程需要使用哪种线程模型来实现, JVM 只是封装了底层操作系统的差异,而不同的操作系统可能使用不同的线程模型,例如 Linux 和 windows 可能使用了一对一模型,solaris 和 unix 某些版本可能使用多对多模型。所以一谈到 Java 语言的多线程模型,需要针对具体 JVM 实现。

Sun JDK 1.2开始,线程模型都是基于操作系统原生线程模型来实现,它的 Window 版和 Linux 版都是使用系统的 1:1 的线程模型实现的。

java中多线程地并发运行是什么意思?有什么作用.好处?

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。因此我们可以用多线程处理并发运行,提高资源利用率;

举例

 假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。

因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;

当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待;

如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人进来;

然后就将任务也分配给这4个临时工人做;

如果说着14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。

当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的。