同步方法的使用:在方法上加synchronized
public synchronized void execute()
{
for(int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("hello: " + i);
}
}
同步代码块的使用:在可能会出现多线程问题的代码片段上加上如下代码
synchronized(this){
}
this代表当前类所对应的对象
通常我们也可以自己创建对象,然后在同步代码块的参数上传入该对象,来控制线层的访问,代码如下:
Object object = new Object();
synchronized(object){
}
当有多个线程访问方法时,只有优先抢到锁的线程会将object对象上锁,那么其他线程就无法再访问了。
同步代码块
public void execute()
{
synchronized(this){
for(int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("hello: " + i);
}
}
}
同步代码块和静态同步方法的区别
在实际开发中,可能会出现一个方法只有2、3行代码有多线程的问题,如果使用同步方法,那么就会把方法中的所有代码都放在同步方法里面,这样做不好的地方是,此方法同一时间只允许一个线程访问该方法,其他线程无法访问,这样会严重影响代码的执行效率。
如果使用同步代码块,只将可能会出现多线程问题的代码放在同步代码块里面,那么当一个线程访问同步代码块里面的代码时,其他线程也可以访问方法里其他的代码,这样代码执行效率会大大增加。所以,通常情况下,能使用同步代码块就尽量使用同步代码块。