顾名思义:同步锁
(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差不多。。。。不举例了,自己实现