Java 线程的创建与同步锁的使用
1.不使用同步锁创建线程
public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { test("线程1---"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { test("线程2----------------"); } }); t1.start(); t2.start(); } static void test(String text) { for (int i = 0; i < 100; i++) { System.out.println(text + i); } } }
运行结果:,线程1与线程2交叉运行,谁先抢占cpu谁就先运行。
2.使用方法级同步锁
public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { test("线程1---"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { test("线程2----------------"); } }); t1.start(); t2.start(); } static synchronized void test(String text) { for (int i = 0; i < 100; i++) { System.out.println(text + i); } } }
运行结果:,线程1先执行,线程2后执行,因为线程1与线程2都执行test(),test()开启了同步锁,所以线程2抢不到cpu,只有等线程1执行完test(),线程2才可以执行test().
3.使用同步代码块进行同步锁
public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { test("线程1---"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { test("线程2----------------"); } }); t1.start(); t2.start(); } static final Object sync = new Object(); static void test(String text) { synchronized (sync) { for (int i = 0; i < 10; i++) { System.out.println(text + i); } } for(int i = 0;i<10;i++) { System.out.println(text+"同步代码块以外代码"); } } }
运行结果:
,顾明思议,这种同步锁只锁住synchronized(obj)包裹的代码,以外的代码不进行同步,这种同步锁使用更灵活,注意同步锁synchronized(obj)中的obj必须是相同的对象,否则同步锁不起作用
4.同步代码块错误使用案例:
public class ThreadTest { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { test("线程1---"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { test("线程2----------------"); } }); t1.start(); t2.start(); } static void test(String text) { synchronized (new Object()) { for (int i = 0; i < 10; i++) { System.out.println(text + i); } } } }
运行结果:,这样写毫无意义,因为同步锁住的obj不是同一个,所以同步锁也就不生效了。