传统线程之同步锁(二)
来源:互联网 发布:sqlserver数据库别名 编辑:程序博客网 时间:2024/05/14 05:30
一. 线程安全
线程安全问题是指程序中公用的东西被多个线程访问,比如:类的静态变量
线程互斥:是指两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行
二. 同步锁
有什么办法可以解决线程安全问题呢?那就是在程序中加锁
Java有两种加锁的方法:
1. 在代码块中加锁 synchronized (this) { ... }
2. 在方法上加锁 public synchronized void xxx(){ ... }
public class TraditionalThreadSynchronized {public static void main(String[] args) {new TraditionalThreadSynchronized().init();}private void init() {final Outputer outputer = new Outputer();// 线程1new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(10);outputer.output1("1111111111");} catch (Exception e) {e.printStackTrace();}}}}).start();// 线程2new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(10);outputer.output1("2222222222");} catch (Exception e) {e.printStackTrace();}}}}).start();}class Outputer {public void output1(String name) {// 同步代码块synchronized (this) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}}// 同步方法public synchronized void output2(String name) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}}}
线程1和线程2因为都要调用output1方法并打印传入的name字符串,cpu就会来回的在两个线程之间切换,
有可能线程1打印到一半的时候就切换到线程2上,这显然是我们不想看到的,所以在代码内容中加锁,
这样可以保证一个线程调用方法结束才会执行下一个线程。
上面代码中的this指的是outputer对象,它就是一把锁,两个线程使用同一把锁才能实现同步。
而在方法上加锁也可以实现线程同步,在方法上使用synchronized关键字也是把this作为锁。
其实output1方法和output2方法也是同步的,因为他们都是使用this作为锁。
思考一个问题:如果把一个方法定义为静态的即:public static synchronized
那么它使用什么作为锁呢?答案是:该类的字节码对象xxx.class
三. Synchonized和ThreadLocal
ThreadLocal和Synchonized都用于解决多线程并发访问,但是它们之间有本质区别,synchonized是利用锁机制,使变量或代码块在某一时刻只能被一个线程访问,而ThreadLocal为每一个线程提供一个变量副本,每个线程在同一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的共享,而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
总结:synchonized用于线程间数据共享,ThreadLocal用于线程间数据隔离。
- 传统线程之同步锁(二)
- 传统线程同步通信技术(三)
- java线程(二):线程同步与同步锁
- 线程同步之二:互斥量
- 多线程之二 线程同步
- 多线程之二:线程同步
- java多线程(二)之线程安全和线程同步
- java并发编程之线程同步基础(二)使用锁实现同步
- 线程(二)-线程同步
- 传统线程同步通讯技术
- 传统线程同步通信技术
- 传统线程同步通信技术
- 传统线程同步通信技术
- JAVA 并发编程-传统线程同步通信技术(四)
- Java并发库(四):传统线程同步通信技术
- JAVA 并发编程-传统线程同步通信技术(四)
- JAVA 并发编程-传统线程同步通信技术(四)
- 线程的同步之读写锁rwlock(二)
- loadView、viewDidLoad及viewDidUnload的关系
- Android开发学习笔记:Intent的简介以及属性的详解
- 黑马程序员---内存管理之循环retain和@class
- 第八周 项目一 分段函数求值
- CocoaPods安装和使用教程
- 传统线程之同步锁(二)
- Android Settings源代码数据储存简易分析
- 如何从官方网站下载jdk1.7?
- Win7 64位 freeglut 和 glew 配置
- PackageManager类的使用
- C++ 60分钟入门教程 - 1、绪论
- 数据结构 单链部分代码 C语言转写(待补充)
- Java 中的内部类
- Sicily 1006 Team Rankings