Java当中的线程(三)

1. 多线程的数据安全

2. 同步线程的方法

1. 多线程的数据安全


 1 class MyThread implements Runnable{
2 int i = 100;
3 public void run(){
4 while(true){
5 System.out.println(Thread.currentThread().getName()+i);
6 i--;
7 Thread.yield();
8 if(i<0){
9 break;
10 }
11 }
12 }
13 }


 1 class Test{
2 public static void main(String args []){
3 MyThread myThread = new MyThread();
4 //生成两个Thread对象,但这两个Thread对象共用同一个线程体
5 Thread t1 = new Thread(myThread);
6 Thread t2 = new Thread(myThread);
7
8 //每个线程都可以设置名字 或 获取名字
9 t1.setName("线程a");
10 t2.setName("线程b");
11
12 t1.start();
13 t2.start();
14 }
15 }

代码看似结果会是 
线程a100-->线程b99-->线程a98-->线程b97-->...

但也会有可能数据安全问题

产生线程a100--->线程b100--->线程b98  的可能的原因是:

线程a100
: System.out.println(Thread.currentThread().getName()+i);

还没到 i-- , 线程b就开始执行了

线程b100:
System.out.println(Thread.currentThread().getName()+i);

线程a : i--

线程b:  i--

线程b98
:System.out.println(Thread.currentThread().getName()+i);

因此 多线程共用同一份数据时, 有可能产生数据安全问题

2. 同步线程的方法

解决上述问题, 同步线程


 1 class MyThread implements Runnable{
2 int i = 100;
3 public void run(){
4 while(true){
5 synchronized(this){ //同步锁, 线程会一直执行到线程锁里面的代码执行完毕
6 System.out.println(Thread.currentThread().getName()+i);
7 i--;
8 Thread.yield();
9 if(i<0){
10 break;
11 }
12 }
13 }
14 }
15 }

Java当中的线程(三)

时间: 2024-10-06 05:31:03

Java当中的线程(三)的相关文章

Java当中的线程(二)

1. 实现线程的第二种方法 2. 控制线程的常用方法 1. 第一种方法是使用继承, 但Java只能使用一次继承, 因此下面这种方法使用的更多 1 class RunnableImpl implements Runnable{ 2 public void run(){ 3 for(int i = 0; i< 100; i++){ 4 System.out.println("Runnable--->" + i); 5 } 6 } 7 } 1 class Test{ 2 publ

Java当中的线程

1. 进程和线程 2. 多线程程序运行模式 3. 定义线程的方法 1. 进程和线程 多进程:在操作系统中能(同时)运行多个任务(程序) 多线程:在同一应用程序中有多个顺序流(同时)执行 2. 多线程程序运行模式 生成线程--->就绪状态--->运行状态--->就绪状态--->运行状态--->....--->死亡状态 3. 定义线程的方法 Java中有两个, 今天学习其中一个. 1 class FirstThread extends Thread{ //定义一个线程类,

Java当中的线程(三)

1.多线程的数据安全 class MyThread implements Runnable{ int i = 100; public void run { while(true){ //Thread.currentThread();获取当前线程是在哪个线程当中运行 System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield(); if(i < 0 ){ break; } } } } class Test{

23.java当中的线程

进程和线程 多线程:在操作系统中能(同时)运行多个任务(程序) 多线程:在同一应用程序中有多个顺序流(同时)执行 线程的执行过程 线程的执行过程 创建线程的方法 方法1:定义一个线程类,他继承类Thread并重写其中的方法run(),方法run(),称为线程体:由于java只支持单继承,用这种方法定义的类不能继承其他类 多线程程序运行模式及方法 定义一个类FirstThread继承Thread,之后用复写的方法,线程执行的时候,执行的是run()中的代码 生成FirstThread的对象,然后调

Java当中的线程(二)

1.实现线程的第二种方法 提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体 class RunnableImpl implements Runnable{ public void run(){ for(int i = 0 ; i < 100 ; i ++ ;){ System.out.println("Runnable-->" + i); } } } cl

【Android 初学】11、关于Android当中的线程(初级)

Start Android 1.回顾Java当中的线程概念 1)线程的两种实现方式 2)线程的生命周期 3)多线程同步 (多个线程访问同一个资源,在同) 2.MainThread与Worker Thread 1)UI相关的代码就是MainThread 2)其他代码就是WorkerThread(不允许操作UI,ProgressBar可以) 3)在一个应用程序当中,主线程通常用于接收用户的输入,以及将运算的结果反馈给用户(也就是主线程不能阻塞) 对于一些可能会产生阻塞的操作,必须放在Worker T

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

java多线程学习(三)——线程栈

一.线程栈模型 线程栈模型是理解线程调度原理以及线程执行过程的基础.线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶,线程栈的内容是随着线程的运行状态变化而变化的,研究线程栈必须选择一个运行的时刻(指代码运行到什么地方) 上图中的栈A是主线程main的运行栈信息,当执行new JavaThreadDemo().threadMethod();方法时,threadMethod方法位于主线程栈中的栈顶,在threadMethod方法中运行的start()方法新建立了一个线程,此时,

Java Thread系列(三)线程安全

Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来说,需要满足以下两个特性: 原子性 可见性 public class MyThread extends Thread { private int count = 5; //synchronized加锁 同步锁 public /*synchronized*/ void run () { System.