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并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...
在Java并发编程中,线程安全是一个至关重要的概念,它涉及到多线程环境下对共享数据的正确管理和访问。线程安全意味着当多个线程同时访问一个对象或数据时,对象的状态能够保持一致性和完整性,不会因为并发导致数据...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
为了实现线程安全,Java提供了多种同步机制,如`synchronized`关键字,它可以确保共享资源在同一时间只能被一个线程访问,从而避免数据不一致的问题。线程安全应优先于性能考虑,因为确保结果正确性是更重要的。 ...
线程同步的主要目标是解决线程安全问题,即在多线程访问共享资源时避免数据的混乱,保证程序的可再现性。这通常涉及到临界资源的管理,如打印机、共享变量或数据结构。在Java中,线程同步可以通过使用同步锁来实现,...
这就是线程安全问题的一个典型例子。 为了解决线程安全问题,我们需要引入线程同步。线程同步是一种控制多个线程并发执行的技术,确保它们按照特定顺序或者避免同时访问共享资源。在Python中,最常用的同步机制是...
4. **线程安全的数据结构**:Java集合框架中的线程安全类,如Vector、ArrayList、LinkedList、HashMap、ConcurrentHashMap的区别和使用场景。 5. **线程通信**:wait()、notify()、notifyAll()方法的使用,以及在...
这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...
本篇学习笔记主要涵盖了线程基础、threading模块的使用以及线程同步控制。 首先,线程是操作系统分配CPU执行时间的基本单位,一个进程可以包含多个线程。在Python3中,线程的状态主要包括新建、就绪、运行、死亡、...
在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。
2. **并发集合**:JUC提供了线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等。这些集合在多线程环境中可以保证数据的一致性和完整性,避免了传统集合在并发操作时可能出现的不一致状态。 3. **...
8. **并发集合**:Java的并发包(java.util.concurrent)提供了线程安全的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了高效的并发控制。 9. **线程中断**:通过Thread.interrupt()方法...
在多线程编程中,进程和线程是两个核心概念。进程是操作系统资源分配的基本单位,每个独立执行的程序都对应一个...在实际开发中,合理利用线程池、同步机制和异常处理可以有效避免线程安全问题,提高程序的并发性能。
- **ThreadLocal**:每个线程都有自己独立的副本,互不干扰,避免了线程安全问题。 8. **线程池** - **ExecutorService**:线程池接口,提供创建、管理和关闭线程池的方法。 - **Executors**:静态工厂方法,...
本篇笔记将深入探讨C#多线程的基本概念、操作方法以及注意事项。 首先,我们要理解多线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行路径和栈空间,但它们共享同一块堆内存。因此,线程间的通信...
本学习笔记主要涵盖了C++中的几个关键主题:线程、指针、调试以及编码实践。 首先,关于C++的线程:在多核处理器的时代,线程成为了实现并行处理和提高程序性能的重要手段。C++11引入了标准库中的`<thread>`,使得...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...