线程同步详解

原创 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
为什么??
这里写图片描述

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

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

线程和线程同步化 详解!

在Microsoft Win32环境中,每个运行的应用程序都构成一个“进程”,而每个“进程”都包含一个或多个“执行线程”。线程指的是程序代码的执行途径,外加一组操作系统分配的资源(堆栈、寄存器状态等等...
  • wozhengtao
  • wozhengtao
  • 2016年05月15日 21:33
  • 690

quartz详解1:初步了解quartz

http://blog.itpub.net/11627468/viewspace-1763389/ 一、引入       你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,...
  • guolong1983811
  • guolong1983811
  • 2016年05月25日 20:16
  • 2978

《这就是搜索引擎:核心技术详解》读书笔记

学Java的时候也顺便看了一下网上的一个爬虫的源码,感觉看完了收获也很有限,只是大概了解了一下其基本思路:从用户添加的种子URL作为起点,不断请求web页面,然后从页面中提取出新的URL,添加到爬取队...
  • hust_dxxxd
  • hust_dxxxd
  • 2016年05月03日 22:12
  • 508

SpringBoot开发详解(一)--初识SpringBoot

初识SpringBoot写在前面的话:越来越多的公司开始使用sprinbgboot作为后台服务器开发的框架,作为目前微服务框架的佼佼者,现在学习springboot框架是一个很好的机会,我自己也在学习...
  • qq_31001665
  • qq_31001665
  • 2017年02月01日 01:06
  • 2337

Java 接口interface的详解

1.接口的概述 主要是使用接口来拓展定义类的功能,可以弥补java中单继承的缺点。 2.接口的定义格式 interface 接口名{ 属性 抽象方法 } 接口的体验 inte...
  • qq_33642117
  • qq_33642117
  • 2016年07月16日 21:50
  • 751

《TCP/IP详解》读书笔记

本书以UNIX为背景,紧贴实际介绍了数据链层、网络层、运输层 一、整体概念 1.各层协议的关系,只讨论四层 各层常见的协议: 网络层协议:IP协议、ICMP...
  • peter517
  • peter517
  • 2013年05月21日 09:41
  • 2884

SpringMVC核心配置文件详解

原文地址:http://downpour.iteye.com/blog/1389285 在上一篇文章中,我们从DispatcherServlet谈起,最终为读者详细分析了SpringMVC的初始化主线...
  • tanga842428
  • tanga842428
  • 2017年01月23日 14:34
  • 3975

Java反射机制详解

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反...
  • oChangWen
  • oChangWen
  • 2016年05月22日 11:52
  • 8365

JDBC入门详解

JDBC入门详解
  • qq_26676207
  • qq_26676207
  • 2016年10月28日 10:06
  • 1543

nginx超详细讲解之概述

下载地址:http://nginx.org/en/download.html 一、nginx目录 conf 配置文件 html 网页文件 logs 日志文件 sbin 主要二进制程序 nginx默...
  • u014459326
  • u014459326
  • 2016年11月27日 21:25
  • 2694
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程同步详解
举报原因:
原因补充:

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