博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程:线程同步与关键字synchronized
阅读量:5330 次
发布时间:2019-06-14

本文共 1011 字,大约阅读时间需要 3 分钟。

一、同步的特性

1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.
2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:
3. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:
4. 如果两个线程要执行一个类中的不同同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 因为一个实例对象就一把锁. 参见实验3:
5. 不光是类实例, 每一个类也对应一把锁, 这样我们也可将类的静态成员函数声明为synchronized, 以控制其对类的静态成员变量的访问. 参见实验4: 
二、synchronized的意义
synchronized用于多线程设计, 有了synchronized关键字, 多线程程序的运行结果将变得可以控制. synchronized关键字用于保护共享数据.
三、synchronized实现同步的机制
synchronized依靠"锁"机制进行多线程同步, "锁"有2种, 一种是对象锁, 一种是类锁.
四、synchronized关键字可以修饰的对象
1. synchronized{static方法 or 普通方法} 函数的修饰符, 就是同步方法.
2. synchronized{修饰代码块} 可作为函数内语句的修饰符, 就是同步语句块
3. synchronized{对象引用} 注意对象必须是线程安全的.(比如: StringBuffer在JDK1.5中是线程安全的, 而数组, ArrayList是不安全的). 参见实验5:
附: 解决线程不安全的方法: 
1. 如果对象是immutable, 则是线程安全的, 例如: String, 可以放心使用.
2. 如果对象是线程安全的, 例如: StringBuffer, 则放心使用.
3. 有条件线程安全, 对于Vector和Hashtable一般情况下是线程安全的, 但是对于某些特殊情况, 需要通过额外的synchronized保证线程安全.
4. 使用synchronized关键字.

转载于:https://www.cnblogs.com/barrywxx/p/4343117.html

你可能感兴趣的文章
Linux Backup: Hard Disk Clone with "dd"
查看>>
RAMDISK 内存盘工具推荐
查看>>
solr研磨之facet
查看>>
(25)Teach girls bravery, not perfection
查看>>
一些常用的标签丨直接代码
查看>>
实验四(数组)
查看>>
函数之装饰器
查看>>
spring + redis 实现数据的缓存
查看>>
How to change @INC to find Perl modules in non-standard locations
查看>>
io与nio的区别
查看>>
Light OJ 1116
查看>>
跟着iMX28x开发套件学linux-05
查看>>
RHEL 5 安装gcc
查看>>
building tool
查看>>
spring配置文件没有错,但是出现红叉的解决方法
查看>>
设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
查看>>
Ubuntu16.04安装MySQLdb
查看>>
《分布式系统原理与范型》习题答案 4.命名
查看>>
接口和抽象类有什么区别
查看>>
犯犯错
查看>>