java多线程机制2(安全问题)

线程状态图:

=================================================================================

/*
* 线程安全问题
*
* 产生的原因:
* 1、线程任务中,有处理共享的数据。
* 2、线程任务中有多条对共享数据的操作。
* 一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
*
* 解决的思想:
* 只要能保证多条操作共享数据的代码在某一时间段,被一条线程所执行,在执行期间不允许其他线程参与运算。
*
* 同步代码块解决
* synchronized (对象obj) {需要同步的代码},这里的obj对象就相当于加锁。
* 同步在目前情况下保证了一次只能有一个线程在执行,其他线程进不来。这就是同步锁机制。
* 好处:解决了多线程安全问题。
* 弊端:减低效率。
*
* 有可能出现这样一种情况:
* 多线程安全问题出现后,加入同步机制,没想到,安全问题依旧。
* 这是肯定是同步出了问题
* 只要遵守了同步的前提,就可以解决。
* 同步的前提:
* 多个线程在同步中,必须使用同一个锁。这才是对多个线程同步。
*/

package thread;

//定义银行类
class Blank{
    private int sum;//银行总共的存款
    private Object obj = new Object();
    public void add(int num){
        synchronized (obj) {//这里的obj相当于一把锁
            sum = sum + num;
            try {
                Thread.sleep(1000);//这里我们让线程睡一秒钟,这样cpu时间片可以充分的切换到其他线程上
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("sum="+sum);
        }
    }
}

//定义储户类
class Customer implements Runnable{

    Blank blank = new Blank();
    @Override
    public void run() {
        //每个储户往银行循环存三次钱,每次100
        for (int i = 0; i < 3; i++) {
            blank.add(100);
        }

    }

}
public class ThreadDemo3 {

    public static void main(String[] args) {
        //创建实现了Runable接口的线程任务对象
        Customer customer = new Customer();
        Thread t1 = new Thread(customer);
        Thread t2 = new Thread(customer);
        Thread t3 = new Thread(customer);
        //开启三条线程模拟三个储户存款
        t1.start();
        t2.start();
        t3.start();
    }

}

运行结果图:可以看到每过一秒钟,会输出一次结果

时间: 2024-11-10 11:18:58

java多线程机制2(安全问题)的相关文章

JAVA多线程_线程安全问题

当多条语句(线程)在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误.这样就是线程的安全问题. 解决线程安全的方式有两种: 1.synchronized同步机制 2.Lock锁 一.synchronized同步机制 1.同步代码块 同步代码块的意思就是将需要操作的共享数据的代码段用synchronized同步执行 synchronized (对象){ // 需要被同步的代码: } 2.同步方法 synchronized可以放在方

Java多线程机制

Java 中的多线程简介 1. 并发与并行的区别: 二者之间的区别在于,并发指的是一个处理器同时处理多个任务,并行指的是多个处理器或者是多核的处理器同时处理多个不同的任务. 2. 并发是逻辑上的同时发生,而并行是物理上的同时发生. 3. 例如:      并发:如同一个人(CPU)喂2个孩子(程序),轮流着每个孩子喂一口,表面上看是两个孩子都在吃饭.   并行:如同2个人喂两个孩子,两个孩子也同时在吃饭. 4. 如下图所示: 5. 进程:一种比较通俗的说法就是在 Windows 下面每打开一个应

JAVA 多线程机制(二)

主要内容 1.理解线程的并发性 2.线程的同步 3.线程的常用方法   上一章中由于线程的并发性导致了多线程的执行总是会出现一些问题..线程的并发性是程序员不可控制 的,也是不可避免的,线程的并发性往往会导致问题的出现..那么我们为什么要控制线程的并发性呢?比 如说:一个公子管理负责人正在修改雇员的工资表,而一些雇员正在领取工资,如果允许这样做必然会造成 混乱,因此,工资管理负责人正在修改工资表的时候,不允许任何的雇员领取工资,也就是说雇员们必须执行 等待状态.. public class ti

J2SE快速进阶——Java多线程机制

学习Java中的线程时,自然而然地联想到之前学过的操作系统中处理器那一块的知识. 定义 文章开头,先大概说一下程序.进程和线程的概念及其之间的关系. 程序:程序就是一段静态的代码,或者一个可执行程序. 进程:进程是程序的一次动态执行的过程,它对应着从代码加载.运行到结束的一次动态的执行过程. 线程:比进程更小的执行单位,一个进程在执行过程中,可以产生多个线程,也就是多个分支.它是程序执行流的最小单位. 来看一个小程序: public class Test { public static void

java 多线程机制

Example12_1.java public class Example12_1 { public static void main(String args[]) { //主线程 SpeakElephant speakElephant; SpeakCar speakCar; speakElephant = new SpeakElephant() ; //创建线程 speakCar = new SpeakCar(); //创建线程 speakElephant.start(); //启动线程 sp

Java学习笔记—第十一章 多线程机制

第十一章 Java多线程机制 了解Java中的进程与线程 1.1 进程:一般程序的结构大致可分为一个入口.一个出口和一个顺序执行的语句序列.程序运行时,系统从程序入口开始,按照语句的执行顺序(包括顺序.分支和循环)完成相应指令,然后从出口退出,程序结束.这样的结构称为进程.可以说,进程就是程序的一次动态执行的过程.一个进程既包括程序的代码,同时也包括系统的资源,如CPU.内存空间等.不同的进程所占用的系统资源都是独立的. 1.2 线程:线程是比进程更小的执行单位.一个进程在执行过程中,为了同时完

java多线程的等待唤醒机制及如何解决同步过程中的安全问题

/* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, String sex){ this.sex=sex; this.name=name; } } class Input implements Runnable{ int x=0; Person p; Input(Person p){ this.p=p; } public void run(){ while

浅谈利用同步机制解决Java中的线程安全问题

我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等着前面千百万人挑选购买,最后心仪的商品下架或者售空......假如饿了吗是单线程程序,那么一个用户得等前面全国千万个用户点完之后才能进行点餐,那饿了吗就该倒闭了不是吗?以上两个简单的例子,就说明一个程序能进行多线程并发访问的重要性,今天就让我们去了解一下Java中多线程并发访问这个方向吧. **第一

Java 多线程安全问题简单切入详细解析

线程安全 假如Java程序中有多个线程在同时运行,而这些线程可能会同时运行一部分的代码.如果说该Java程序每次运行的结果和单线程的运行结果是一样的,并且其他的变量值也都是和预期的结果是一样的,那么就可以说线程是安全的. 解析什么是线程安全:卖电影票案例 假如有一个电影院上映<葫芦娃大战奥特曼>,售票100张(1-100号),分三种情况卖票: 情况1 该电影院开设一个售票窗口,一个窗口卖一百张票,没有问题.就如同单线程程序不会出现安全问题一样. 情况2 该电影院开设n(n>1)个售票窗口