java 多线程 day03 线程同步

package com.czbk.thread;

/** * Created by chengtao on 17/12/3.         线程安全问题:

线程安全出现 的根本原因:         1. 存在两个或者两个以上 的线程对象共享同一个资源。         2. 多线程操作共享资源的代码 有多句。

线程安全问题的解决方案:

方式一: 可以使用同步代码块去解决。

格式:         synchronized(锁对象){         需要被同步的代码         }

同步代码块要注意的事项:         1. 锁对象可以是任意的一个对象。         2. 一个线程在同步代码块中sleep了,并不会释放锁对象。         3. 如果不存在着线程安全问题,千万不要使用同步代码块,因为会降低效率。         4. 锁对象必须是多线程共享的一个资源,否则锁不住。

方式二:同步函数  :  同步函数就是使用synchronized修饰一个函数。

同步函数要注意的事项 :         1. 如果是一个非静态的同步函数的锁 对象是this对象,         如果是静态的同步函数的锁 对象是当前函数所属的类的字节码文件(class对象)。         2. 同步函数的锁对象是固定的,不能由你来指定 的。

推荐使用: 同步代码块。         原因:         1. 同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定 的,不能由我们来指定。         2. 同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数 的所有代码都被同步了。 */public class Thread03_TraditionalThread_Synchronized {    /**     * @param args     */    public static void main(String[] args) {        new Thread03_TraditionalThread_Synchronized().init();    }

private void init(){        final Outputer outputer = new Outputer();        new Thread(new Runnable(){            public void run() {                while(true){                    try {                        Thread.sleep(10);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    outputer.output("zhangxiaoxiang");                }

}        }).start();

new Thread(new Runnable(){            public void run() {                while(true){                    try {                        Thread.sleep(10);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    outputer.output3("lihuoming");                }

}        }).start();

}

static class Outputer{

/*        直接打印,会出现同步问题,        第一个线程打印到一半的时候,        第二个线程如果获取到cpu,        那么第一个线程的字符串就只能打印一半         */        public void output(String name){            int len = name.length();            for(int i=0;i<len;i++){                System.out.print(name.charAt(i));            }            System.out.println();        }

/*           通过同步代码块来控制,注意锁对象一定要唯一         */        public void output1(String name){            int len = name.length();            synchronized (Outputer.class)            {                for(int i=0;i<len;i++){                    System.out.print(name.charAt(i));                }                System.out.println();            }        }

/*           通过同步方法来控制,非静态的同步函数的锁 对象是this对象         */        public synchronized void output2(String name){            int len = name.length();            for(int i=0;i<len;i++){                System.out.print(name.charAt(i));            }            System.out.println();        }

/*           通过同步方法来控制, 静态的同步函数的 锁对象是当前函数所属的类的字节码文件(class对象)。         */        public static synchronized void output3(String name){            int len = name.length();            for(int i=0;i<len;i++){                System.out.print(name.charAt(i));            }            System.out.println();        }    }}
时间: 2024-08-06 23:27:49

java 多线程 day03 线程同步的相关文章

java多线程之 ---- 线程同步

java多线程之线程同步 线程同步 定义:同步是指在同一时间段内只能运行一个线程. 分类:同步方法.同步块. 作用:安全解决共享问题. 同步块: 语法: synchronized (同步对象) { 需要同步的代码; } 例子: public class ThreadDemo implements Runnable{ private int ticket = 5; public void run(){ for(int i=1;i<=5;i++){ synchronized (this){ if(t

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例

Java多线程之线程同步

一.多线程出现的安全问题: 1.问题的原因: 多个线程执行的不确定性引起执行结果的不稳定.当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误.2.解决的办法: 对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行. 二.Synchronized的使用方法: 1.操作共享数据的代码,即为需要被同步的代码.不能包含代码多或者少.2.共享数据:多个线程共同操作的变量.比如:ticket就是共

java多线程编程——线程同步之同步函数

如何找出线程安全问题: 1.明确那些代码块是多线程运行代码 2.明确共享数据 3.明确多线程运行代码中哪些语句是操作共享数据的 同步函数示例: class Save{ private int sum; public synchronized void add(int n){ sum+=n; System.out.println("sum="+sum); } } class Cus implements Runnable{ private Save b=new Save(); publi

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i

Java多线程之线程的同步

Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同一个数据时,非常容易出现线程安全问题.具体原因如下:   1,多个线程同时访问一个数据资源(该资源称为临界资源),形成数据发生不一致和不完整.   2,数据的不一致往往是因为一个线程中的多个关联的操作(这几个操作合成原子操作)未全部完成. 关于线程安全问题,有一个经典的情景:银行取钱.代码如下: /

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

Java多线程之线程的控制

Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dead 如果将"锁池"和"等待队列"都看成是"阻塞"状态的特殊情况,那么可以将线程归纳为5个状态: 新建,就绪,运行,阻塞,死亡. ┌--------------------< 阻塞 ↓                    (1)(2)(3)  

Java多线程之线程的通信

Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些线程中哪个线程拿到锁标记由系统决定.前面我们也有T到死锁的概念,线程互相等待其他线程释放锁标记,而又不释放自己的:造成无休止地等待.当出现死锁的时候,我们应该如何解决呢?通过线程间的通信解决. 线程间通信: 多线程之间的通信有2种方式,第一种是使用object类的几个方法,第二种是使用条件变了来控制