2、传统的线程互斥synchronized
synchronized使用之基本原则:
synchronized可以锁方法,也可以锁代码片段,但要实现互斥的基本就是在想要互斥的代码上加”同一把锁“,也就是同一个对象,也就是用==判断等于true的对象
下面看一个例子:
Work.java 真正做事情的类
package com.yzl;
public class Work {
/**
* 未同步的
* @param name
*/
public void noSynwrite(String name){
for(int i=0; i<name.length(); i++){
System.out.print(name.charAt(i));
if(i == (name.length()-1)){
System.out.print("\n");
}
}
}
/**
* 使用同步块,并使用Work的实例对象做为锁
* 此方法的同步需保证是调用该方法的work对象是同一个
* @param name
*/
public void write1(String name){
synchronized (this) {
for(int i=0; i<name.length(); i++){
System.out.print(name.charAt(i));
if(i == (name.length()-1)){
System.out.print("\n");
}
}
}
}
/**
* 使用同步块,并使用Work的字节码做为锁
* @param name
*/
public void write1WithStatic(String name){
synchronized (Work.class) {
for(int i=0; i<name.length(); i++){
System.out.print(name.charAt(i));
if(i == (name.length()-1)){
System.out.print("\n");
}
}
}
}
/**
* 使用同步的方法,锁对象为ork的实例对象
* 此方法的同步需保证是调用该方法的work对象是同一个
* @param name
*/
public synchronized void write2(String name){
for(int i=0; i<name.length(); i++){
System.out.print(name.charAt(i));
if(i == (name.length()-1)){
System.out.print("\n");
}
}
}
/**
* 静态方法的同步方法,同步的对象是对象的字节码,也就是Work.class
* 如果要与上面的方法一起使用并保持互斥,则可以把write1的锁对象this改成Work.class
* @param name
*/
public synchronized static void write3(String name){
for(int i=0; i<name.length(); i++){
System.out.print(name.charAt(i));
if(i == (name.length()-1)){
System.out.print("\n");
}
}
}
}
测试类ThreadPart_2.java
package com.yzl; /**
* 传统的线程互斥
* 原理:使用同一个对象(锁)才能实现,
* 静态方法的同步则只能使用类的字节码也就是ClassName.class来做锁
* @author yzl
*
*/
public class ThreadPart_2 {
public static void main(String[] args) {
noSyn();
synWithOneObj();
synWithOneStaticObj();
} /**
* 未线程同步的
*/
private static void noSyn(){
final Work work = new Work(); Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
work.noSynwrite("wangwu");
}
}
});
thread.start(); Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
work.noSynwrite("zhangsan");
}
}
});
thread1.start();
} /**
* 使用同一个实例对象做为锁的
*/
private static void synWithOneObj(){
final Work work = new Work(); Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
work.write1("wangwu");
}
}
});
thread.start(); Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
work.write2("zhangsan");
}
}
});
thread1.start();
} /**
* 使用同一个类的字节码做为锁的
*/
private static void synWithOneStaticObj(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
new Work().noSynwrite("wangwu");
}
}
});
thread.start(); Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
Work.write3("zhangsan");
}
}
});
thread1.start();
}
}
将上面ThreadPart_2的第12、13、14行代码分别依次执行,
第12行代码将出现如下类似结果:
//运行结果部分示例
zhangsan
zhwu
wangwu
wangangsan
zhangsawangwu
第13和14行将是正常的打印各自的名字
2、传统的线程互斥synchronized的更多相关文章
- 传统的线程互斥技术:Synchronized关键字
多个线程操作同一个方法或变量时常常出现错误,要保证每个线程都正常运行就要通过加锁,每次只有一个能够拿到锁通过.如下: package cn.sp.thread; /** * Created by 2Y ...
- 线程互斥synchronized
/** * * 线程互斥,采用synchronized关键字可以实现线程与线程之间的互斥,要注意的是在synchronized上的对象要是同一个,才可以 * 保证在同一时刻,只有一个线程可以执行syn ...
- 【Java并发专题之三】Java线程互斥、协作原理
(I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...
- 【原】iOS多线程之线程间通信和线程互斥
线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...
- java线程安全— synchronized和volatile
java线程安全— synchronized和volatile package threadsafe; public class TranditionalThreadSynchronized { pu ...
- java多线程与线程并发二:线程互斥
本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 当两条线程访问同一个资源时,可能会出现安全隐患.以打印字符串为例,先看下面的代码: // public class Test2 { p ...
- Java线程同步synchronized的理解
JVM中(留神:马上讲到的这两个存储区只在JVM内部与物理存储区无关)存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,所有实例和实例的字段都在此区域,对于所有的线程是共享 ...
- GIL与线程互斥锁
GIL 是解释器级别的锁,是限制只有一个原生线程运行,防止多个原生线程之间修改底层的共享数据.而线程互斥锁是防止多个线程同时修改python内存空间的共享数据.
- C#中的多线程与线程互斥
通过多线程,C#可以并行地执行代码. 每一个线程都有它独立的执行路径,所有线程都能访问共有变量. 这就引发了线程竞争 这时就需要使用线程安全的处理方式使得线程互斥 先来看一段多线程代码 using S ...
随机推荐
- Java 条件编译
在C/C++中,使用#ifdef…#endif的代码,如果不满足条件,编译器是不会对这部分代码进行编译的.Java中并没有这种“条件编译”特性.这种特性在C语言里是用来解决代码的跨平台问题的,可以通过 ...
- iOS測试——置换測试: Mock, Stub 和其它
文章地址:http://ryantang.me/blog/2014/08/21/test-doubles/
- 第二章 IOC + AOP 底层原理
<精通Spring4.x 企业应用开发实战>读书笔记 一.概念 IOC: 假设B类调用了A类,那么A类的对象的创建是由B类来实现: IOC是指将A对象的创建由容器来完成,并且将创建好的对象 ...
- Sharepoint2013 列表的NewForm 页面添加一个 保存新建 按钮
昨天一同事问我如何在sharepoint2013的NewForm.aspx页面上添加一个 save and new的button.实现save 和new的功能,save的功能和默认的save按钮效果一 ...
- Gridview利用DataFormatString属性设置数据格式
首 先把Gridview的AutoGenerateColumns属性设为False(默认是False),DataField选择相应的字段,特别需要注 意的是要把需要设置的字段的HtmlEncode属性 ...
- Http协议中Get和Post的浅谈
起名困难户,每次写文章最愁的就是不知道该如何起个稍具内涵的名字,如果这篇文章我只是写写Get和Post的区别,我可以起个名字“Get和Post的那点事”,如果打算阐述一下Http协议原理性内容,那该叫 ...
- AS 阿里巴巴Java开发规约 CheckStyle-IDEA
Alibaba Java Coding Guidelines 简介 github地址:https://github.com/alibaba/p3c 官方文档 阿里巴巴Java开发手册(纪念版) ...
- 添加 Github follow、star按钮到网页
怎么把github的star/fork/watch三个按钮弄到自己网站上? 就是这个按钮如何弄到我的网站里面来,是否有API呢?mdo/github-buttons · GitHub这个超级方便已经添 ...
- 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)
编辑 | MingMing 尽管机器学习的历史可以追溯到1959年,但目前,这个领域正以前所未有的速度发展.最近,我一直在网上寻找关于机器学习和NLP各方面的好资源,为了帮助到和我有相同需求的人,我整 ...
- vue组件的hover事件模拟、给第三方组件绑定事件不生效问题
1.vue里面实现hover效果基本需要用事件模拟 <div @mouseover="overShow" @mouseout="outHide"> ...