多线程之synchronized

来源:互联网 发布:区块链 p2p网络层 编辑:程序博客网 时间:2024/05/08 19:09

顾名思义:同步锁

1)同步代码:但是锁住的不是代码,而是传入的对象,看个例子:

这个例子的主要意思:

肯定先运行t1.start(),再运行t2.start()

但是这两个用同一个service,所有,但在t1.fun1()锁住3秒时,t2.fun2()也会被同步锁住,

最后还是先输出fun1,再输出fun2,

如若:去掉fun2()的同步锁代码,则先输出fun2,3秒后再输出fun2,


class Service {
//定义方法fun1
public void fun1(){
//同步
synchronized(this){
try{
//休眠3秒,记得放在try--catch
Thread.sleep(3000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("fun1");
}
}

//定义方法fun2
public void fun2(){
//同步
synchronized(this){
System.out.println("fun2");
}
}

}


class MyThread implements Runnable{
//定义私人服务类对象
private Service service;

public MyThread(Service service){
this.service = service;
}

//重写run()
public void run(){
service.fun1();
}
}


//定义类MyThread2实现Runnable接口
class MyThread2 implements Runnable{
//定义私人服务类
private Service service;

//构造方法
public MyThread2(Service service){
this.service = service;
}

//重写Runnable接口的run方法
public void run(){
service.fun2();
}
}

//测试类
class Test{
public static void main(String args []){
//生成Service对象
Service service = new Service();

//分别生成参数不同的Thread对象
Thread t1 = new Thread(new MyThread(service));
Thread t2 = new Thread(new MyThread2(service));

//启动线程
t1.start();
//System.out.println("aaa");
t2.start();
}
}

输出:

F:\work\src\synchronized>java Test
fun1
fun2


F:\work\src\synchronized>java Test
fun1
fun2

但是有时会输出:

F:\work\src\synchronized>java Test
fun2
fun1


F:\work\src\synchronized>java Test
fun2
fun1

个人认为:

这是cpu抢占的问题t1.start()和t2.start()方法距离太近,可能是调用fun1和fun2的过程中,t2比t1快了,但是同步锁是没错的,

如果在t1.start()和t2.start()的中间加一行树System.out.println("aaaa");

则不会发生fun2比fun1快的情况


2,锁住方法,在public 后面加synchronized,

如:

上题中的,public synchronized void fun1()

把fun1()内的synchronized去掉

其它类似

用法与1差不多。。。。不举例了,自己实现

0 0
原创粉丝点击