Java基础之同步


同步的同步是一个同步锁关键字,作用就是让线程只能逐一执行,不能并行执行,至于底层怎么实现,不是我这种连用都不会的人改关注的。
用法
-修饰代码快(非静态)
测试代码(不加同步):
公开课同步{
公共静态void main (String [] args) {
老师老师=新老师();
线程第一次=new SynchronizedThread(“至上”,老师),
线程第二=new SynchronizedThread (“second"、教师);
first.start ();
second.start ();
}
静态类SynchronizedThread延伸线{
私人字符串名称;
私人老师老师;
公共SynchronizedThread(字符串名称,老师老师){
this.name=名字;
。老师=老师;}
@Override
br/>}
@Override
teacher.say(名字),
}
}
静态类老师{
公共空说(字符串名称){
System.out.println(“我正在教“;+名字),
//System.out.println(“线程进入睡眠“);
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
}
}
执行结果:
我正在教第一个
我正在教第二
第二睡眠三秒
第一次睡眠三秒
两个睡眠三秒几乎是同时出现。
测试代码(加同步):
静态类老师{
公共空说(字符串名称){
System.out.println(“我正在教“;+名字),
同步(){
//System.out.println(“线程进入睡眠“);
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
}
}
输出结果:
我正在教第一个
我正在教第二
第一次睡眠三秒
第二睡眠三秒
虽然看着是一样的,实际输出的时候,是先输出一个睡眠三秒,3秒之后,再输出一个睡眠三秒。
总结:在多个线程操作同一个对象,执行加锁的对象方法的时候,逐一执行同步代码块中的代码,锁的是对象实例
-修饰对象方法
测试代码(加同步):
静态类老师{
公共同步空虚说(字符串名称){
System.out.println(“我正在教“;+名字),
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
}
执行结果:
我正在教第一
睡眠三秒
我正在教第二
第二睡眠三秒
可以看到输出结果是先是一个线程(第一个)执行了方法,然后是另外一个线程(二)执行了方法。
测试代码(不加同步):
静态类老师{
公共空说(字符串名称){
System.out.println(“我正在教“;+名字),
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
}
执行结果:
我正在教第一个
我正在教第二
第二睡眠三秒
第一次睡眠三秒
可以看到两个线程几乎同时执行了,这和代码块的测试是一样的结果。
测试代码(一个方法不加同步的,一个方法加同步):
公开课同步{
公共静态void main (String [] args) {
老师老师=新老师();
线程第一次=new SynchronizedThread(“至上”,老师),
线程第二=new AnotherSynchronizedThread (“second"、教师);
first.start ();
second.start ();
}
静态类SynchronizedThread延伸线{
私人字符串名称;
私人老师老师;
公共SynchronizedThread(字符串名称,老师老师){
this.name=名字;
。老师=老师;}
@Override
br/>}
@Override
teacher.say(名字),
}
}
静态类AnotherSynchronizedThread延伸线{
私人字符串名称;
私人老师老师;
公共AnotherSynchronizedThread(字符串名称,老师老师){
this.name=名字;
。老师=老师;}
@Override
br/>}
@Override
teacher.hello(名字),
}
}
静态类老师{
公共同步空虚说(字符串名称){
System.out.println(“我正在教“;+名字),
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
公共空你好(字符串名称){
System.out.println(“我会说hello");
System.out.println(“你好“+名字),
}
}
}
执行结果:
我正在教第一个
我会说你好
你好第二
第一次睡眠三秒
可以看的到,多线线程执行同一个对象的同步方法和非同步方法的时候,两个方法的执行相互不影响。
测试代码(一个方法加同步,另外一个方法也加同步):
静态类老师{
公共同步空虚说(字符串名称){
System.out.println(“我正在教“;+名字),
SleepUtil.sleep (3000),
system . out。println(名字+“睡眠三秒“);
}
公共同步空白你好(字符串名称){
System.out.println(“我会说hello");
System.out.println(“你好“+名字),
}

Java基础之同步