【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

线程同步详解

原创 2016年05月31日 16:59:13

线程同步方式有很多种,其中一种便是synchronized,下面先用一个例子来说一下它的两种应用场景:

package thread;

public class TestSync implements Runnable{
    Timer timer=new Timer();
    public static void main(String args[]){
        TestSync test=new TestSync();
        Thread t1=new Thread(test);
        Thread t2=new Thread(test);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
    }
    public void run(){
        timer.add(Thread.currentThread().getName());
    }
}
class Timer{
    private static int num=0;
    //public synchronized void add(String name){第二种方式处理
    public void add(String name){
        //synchronized (this) {第一种方式处理线程同步
            num++;
            try{
                Thread.sleep(1);
            }catch(InterruptedException e){

            }
            System.out.println(name+",你是第"+num+"个使用timer的线程");
        //}
    }
}

如果用debug模式下慢点儿调试,输出结果是:
t1,你是第1个使用timer的线程
t2,你是第2个使用timer的线程

如果用start模式下慢点儿调试,输出结果是:
t2,你是第2个使用timer的线程
t1,你是第2个使用timer的线程

package thread;

public class TestDeadLock implements Runnable{//第三步
    public int flag=1;//第二步
    static Object o1=new Object(),o2=new Object();
    public void run(){
        System.out.println("flag="+flag);
        if(flag==1){
            synchronized (o1) {
                try{
                    Thread.sleep(500);
                }catch(Exception e){
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1");
                }
            }
        }
        if(flag==0){
            synchronized (o2) {
                try{
                    Thread.sleep(500);
                }catch(Exception e){
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("0");
                }
            }
        }
    }
    public static void main(String args[]){
        TestDeadLock td1=new TestDeadLock();//第一步
        TestDeadLock td2=new TestDeadLock();
        td1.flag=1;
        td2.flag=0;
        Thread t1=new Thread(td1);
        Thread t2=new Thread(td2);
        t1.start();
        t2.start();
    }
}

在实践的过程中突然想到一个问题:
线程执行快慢与它的启动顺序有关吗?
后来在反复验证后发现,他们并没有直接关系。

上面的情况在很多情况下还是容易引起线程死锁的,像下图这样,一直在等待对方释放:
这里写图片描述
可以通过加大锁的粒度来减少死锁的情况。

这里写图片描述
像上图这样,加了同步效率降低,不同步数据不一致
不允许朵儿线程同时改,但允许多个线程同时读
这里写图片描述
打印结果:2000
为什么??
这里写图片描述

注意:如果两个方法改了同一个值,两个方法都应该加同步

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

线程同步归纳总结

“多线程”在大型软件程序中有着很广泛的应用,其优点如下: 第一,将原来在一个大流程中实现的功能放到了多个小流程中,程序更加的简洁和易于阅读。 第二,将不同的功能放到不同的线程中,提高了程序的执行效...

浅析线程及同步

守护线程 通常情况下 后台的应用程序就是守护程序 被守护的线程结束了即使守护的线程没有结束那么也将会结束 线程的局部变量:解决多线程共享同个对象的时候,对象属性数据安全问题 Thread...

秒杀多线程第四篇 一个经典的多线程同步问题

上一篇《秒杀多线程第三篇原子操作 Interlocked系列函数》中介绍了原子操作在多进程中的作用,现在来个复杂点的。这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果能将这个问...

实现线程同步的几种方式

为何要使用同步?java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之...

C#基本线程同步

http://blog.csdn.net/mousebaby808/article/details/5477733 0 概述   所谓同步,就是给多个线程规定一个执行的顺序(或称为时序...

多线程同步

1.为什么使用多线程 多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。 ...

线程同步的几种实现方法

一、引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊。闲话不多说,进入正题。 二、为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读...

线程之线程同步

前言 当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图。如果每个线程使用的变量都是其他线程不会读取或修改的,那么就不会存在一致性问题。同样地,如果变量是只读的,多个线程同时读取...

线程同步的几种方式

进程中线程同步的四种常用方式: 一、 临界区(CCriticalSection) 当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,...

线程和线程同步化 详解!

在Microsoft Win32环境中,每个运行的应用程序都构成一个“进程”,而每个“进程”都包含一个或多个“执行线程”。线程指的是程序代码的执行途径,外加一组操作系统分配的资源(堆栈、寄存器状态等等...
  • yjkwf
  • yjkwf
  • 2010-04-06 15:05
  • 2428
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)