`
maximilian_kevin
  • 浏览: 1691 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

线程安全学习笔记(一)

阅读更多
Java面试的话,基本肯定会问到的一个问题就是关于volatile与syncronized的区别. Syncronized强同步,volatile弱;volat不好用,想我这样的菜鸟用不来.这是我对于这两个的认识,其他更高深的就说不上来了.
先来看下syncronized的作用,这里以StringBuilder和StringBuffer为例来说明。
线程类实现:
package com.maximilian.www;

public class MyTestThread extends Thread
{
	private int _loopTimes=50;
	private int _threadId;
	private static StringBuffer sb1 =new StringBuffer();
	private static StringBuffer sb3 =new StringBuffer();
	private static StringBuilder sb2 =new StringBuilder();
	public MyTestThread(int threadId ,int loopTimes)
	{
		_threadId = threadId;
		_loopTimes = loopTimes;
	}
	@Override
    public void run()
    {
	    while(_loopTimes > 0)
	    {
	    	sb1.append("thread").append(_threadId).append(":").append(_loopTimes).append("\r\n");
	    	sb2.append("thread").append(_threadId).append(":").append(_loopTimes).append("\r\n");
	    	sb3.append("thread"+_threadId+":"+_loopTimes+"\r\n");
	    	_loopTimes--;
	    }
	 }
	public static void printSb1()
	{
		System.out.println(sb1);
	}
	public static void printSb2()
	{
		System.out.println(sb2);
	}
	public static void printSb3()
	{
		System.out.println(sb3);
	}
}


测试代码:
package test;

import java.util.Vector;

import com.maximilian.www.MyTestThread;



public class MyTest
{
	private static int loopTimes=10;
	private static int threadNum = 2;
	private static int threadId;
	private static Vector<Thread> threads = new Vector<Thread>();
	public static void main (String [] args)
	{
	    for(threadId=0;threadId < threadNum ;threadId++)
	    {
		    Thread t = new Thread(new MyTestThread(threadId, loopTimes),"mytestthread");
		    threads.add(t);
	    }
	    for(Thread t:threads)
	    {
	    	t.start();
	    }
	    for(Thread t:threads)
	    {
	    	try
            {
	            t.join();
            } catch (InterruptedException e)
            {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
            }
	    }
	    System.out.println("+++++++++++++++++++++++++sb1++++++++++++++++++++++");
	    MyTestThread.printSb1();
	    System.out.println("+++++++++++++++++++++++++sb2++++++++++++++++++++++");
	    MyTestThread.printSb2();
	    System.out.println("+++++++++++++++++++++++++sb3++++++++++++++++++++++");
	    MyTestThread.printSb3();
	}
}



上面的代码主要是实现字符串的连接。先看结果如何:
+++++++++++++++++++++++++sb1++++++++++++++++++++++
thread0:10
thread0:9
thread1:10
thread0:8
thread1:9
thread0:7
thread1:8
thread0:6
thread1:7
thread0:5
thread1:6
thread0:4
thread1:5
thread0:thread31
:4
thread1thread:03:
2

thread1:2
thread0:thread11
:1
+++++++++++++++++++++++++sb2++++++++++++++++++++++
thread0:10
thread0:9
thread1:10
thread0:8
thread1:9
thread0:7
thread1:8
thread0:6
thread1:7
thread0:5
thread1:6
thread0:4
thread1:5t
read
0:3
thread1:4hread 0:1

thread1:2
thread1:1
+++++++++++++++++++++++++sb3++++++++++++++++++++++
thread0:10
thread0:9
thread1:10
thread0:8
thread1:9
thread0:7
thread1:8
thread0:6
thread1:7
thread0:5
thread1:6
thread0:4
thread1:5
thread1:4
thread0:3
thread1:3
thread0:2
thread1:2
thread1:1
thread0:1

看一下StringBuilder和StringBuffer的代码可以发现,他们的代码除了StringBuffer在方法前面加了syncronized其他完全一样,这也是导致sb2会出现即使是在一个append中的内容都会有其他的加入的情况(红色部分),而sb1出现红色部分的情况是因为虽然append这个方法是线程安全,但是append操作之间是没有同步的,这个在要求线程一次完全连接操作时可以用sb3的方法,或者个人认为更好的对整个连接过程加syncronized。
    另外,注意join的调用不能跟start一起遍历时操作,不然会导致线程是一个个顺序线性执行。
分享到:
评论

相关推荐

    Java线程编程学习笔记(二)

    这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...

    JAVA并发编程实践-线程安全-学习笔记

    在Java并发编程中,线程安全是一个至关重要的概念,它涉及到多线程环境下对共享数据的正确管理和访问。线程安全意味着当多个线程同时访问一个对象或数据时,对象的状态能够保持一致性和完整性,不会因为并发导致数据...

    线程技术学习笔记.docx

    为了实现线程安全,Java提供了多种同步机制,如`synchronized`关键字,它可以确保共享资源在同一时间只能被一个线程访问,从而避免数据不一致的问题。线程安全应优先于性能考虑,因为确保结果正确性是更重要的。 ...

    Java中线程同步和线程协作学习笔记

    线程同步的主要目标是解决线程安全问题,即在多线程访问共享资源时避免数据的混乱,保证程序的可再现性。这通常涉及到临界资源的管理,如打印机、共享变量或数据结构。在Java中,线程同步可以通过使用同步锁来实现,...

    python线程教程,python线程学习笔记.doc

    这就是线程安全问题的一个典型例子。 为了解决线程安全问题,我们需要引入线程同步。线程同步是一种控制多个线程并发执行的技术,确保它们按照特定顺序或者避免同时访问共享资源。在Python中,最常用的同步机制是...

    马士兵多线程训练营笔记

    4. **线程安全的数据结构**:Java集合框架中的线程安全类,如Vector、ArrayList、LinkedList、HashMap、ConcurrentHashMap的区别和使用场景。 5. **线程通信**:wait()、notify()、notifyAll()方法的使用,以及在...

    C++多线程学习笔记1

    这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`&lt;thread&gt;`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...

    Python3的多线程学习笔记[定义].pdf

    本篇学习笔记主要涵盖了线程基础、threading模块的使用以及线程同步控制。 首先,线程是操作系统分配CPU执行时间的基本单位,一个进程可以包含多个线程。在Python3中,线程的状态主要包括新建、就绪、运行、死亡、...

    学习笔记多线程Unix编程

    在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。

    JUC多线程学习个人笔记

    2. **并发集合**:JUC提供了线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等。这些集合在多线程环境中可以保证数据的一致性和完整性,避免了传统集合在并发操作时可能出现的不一致状态。 3. **...

    马士兵多线程笔记.zip

    8. **并发集合**:Java的并发包(java.util.concurrent)提供了线程安全的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了高效的并发控制。 9. **线程中断**:通过Thread.interrupt()方法...

    多线程学习笔记.docx

    在多线程编程中,进程和线程是两个核心概念。进程是操作系统资源分配的基本单位,每个独立执行的程序都对应一个...在实际开发中,合理利用线程池、同步机制和异常处理可以有效避免线程安全问题,提高程序的并发性能。

    java多线程学习笔记

    - **ThreadLocal**:每个线程都有自己独立的副本,互不干扰,避免了线程安全问题。 8. **线程池** - **ExecutorService**:线程池接口,提供创建、管理和关闭线程池的方法。 - **Executors**:静态工厂方法,...

    C#多线程笔记学习指南

    本篇笔记将深入探讨C#多线程的基本概念、操作方法以及注意事项。 首先,我们要理解多线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行路径和栈空间,但它们共享同一块堆内存。因此,线程间的通信...

    c++学习笔记(c++ 线程 指针 调试 编码)

    本学习笔记主要涵盖了C++中的几个关键主题:线程、指针、调试以及编码实践。 首先,关于C++的线程:在多核处理器的时代,线程成为了实现并行处理和提高程序性能的重要手段。C++11引入了标准库中的`&lt;thread&gt;`,使得...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

Global site tag (gtag.js) - Google Analytics