java 互斥_线程系列2--Java线程的互斥技术

java的多线程互斥主要通过synchronized关键字实现。一个线程就是一个执行线索,多个线程可理解为多个执行线索。进程有独立的内存空间,而进程中的线程则是共享数据对象资源。这样当多个执行线索在CPU的切换下交替执行,就会出现一些恶心的情况,执行的结果也是匪夷所思。第一个线程未执行完,CPU切换到另一个线程执行,由于数据资源共享,将导致程序的执行混乱。解决线程间的互斥主要就是通过synchronized来实现。

下面利用传智播客里面的代码举例分析:

package com.cqfczc.util;

/**

* 多线程的互斥技术

* @author zhenliang

*

*/

public class ThreadSynchronized {

public static void main(String[] args) {

new ThreadSynchronized().testThread();

}

private void testThread(){

final OutPutPrinter printer = new OutPutPrinter();

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

Thread.sleep(20);

} catch (InterruptedException e) {

e.printStackTrace();

}

printer.printer("风铃三世爱着猴子");

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

Thread.sleep(20);

} catch (InterruptedException e) {

e.printStackTrace();

}

printer.printer("猴子始终喜欢杨婵");

}

}

}).start();

}

//多线程不适用互斥技术时的有问题代码

class OutPutPrinter{

public void printer(String name){

if(name == null){

throw new NullPointerException("参数不能为空!");

}

int nameLength = name.length();

for(int i=0;i

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

1、自定义的对象作为锁对象

实现方式 :synchronized(){…}

适用情况:当出现需要在多个类(或者多个类的实例)之间进行互斥控制时,需要采用本方法。

class OutPutPrinter{

private String lock = "大泼猴";

public void printer(String name){

if(name == null){

throw new NullPointerException("参数不能为空!");

}

int nameLength = name.length();

synchronized(lock){

for(int i=0;i

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

2、以this作为锁对象

实现方式:synchronized(this){…},synchronized实例方法;

适用情况:适用于使用类的同一个实例(对象)作为锁对象。

// 同步方法,相当于synchronized(this){}

public synchronized void output2(String name) {

int len = name.length();

for(int i=0; i

System.out.print(name.charAt(i));

}

System.out.println();

}

3、以Outputer.class作为锁对象

Outputer类的字节码对象由jvm自动加载。

实现方式:synchronized(Outputer.class){…} ,static synchronized方法

适用情况:适用于整个类的所有对象都需要互斥访问的情况

// 静态同步方法,相当于synchronized(Outputer.class){}

public static synchronized void output3(String name) {

int len = name.length();

for(int i=0; i

System.out.print(name.charAt(i));

}

System.out.println();

}

总结:同一个类中代码块或者方法的互斥,使用this或者类的字节码作为对象锁;当需要在多个类(或者多个类的实例)之间进行互斥控制时,使用自定义对象锁或类字节码对象锁;因为类的字节码全世界只有一份,自定义的对象锁是类内部的一个成员变量,每次创建新对象的时候属性是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值