java线程同步 synchronized失效???(理解好是否上锁的是同一个对象)
看是否给同一个对象上锁!
情况是1:多个线程执行同个对象,即多个运行任务的线程执行同一个任务对象
情况2:多个线程执行不同的多个对象,即多个运行任务的线程执行不同的多个任务对象
代码:
?ts 测试类
package eating; public class ts { public static void main(String[] args){ AppleNum appleNum = new AppleNum(20); // Apple apple = new Apple(appleNum); Apple[] apple = new Apple[5]; String[] names = { "小红", "小黄", "小蓝", "小绿", "小青" }; for(int i = 0; i < names.length; i++) { apple[i] = new Apple(appleNum); new Thread(apple[i], names[i]).start(); } } }
?AppleNum 苹果数量类:
package eating; public class AppleNum { /* 苹果数量 */ int num; public AppleNum(int num) { this.num = num; } public int getNum() { return num; } public int setNum(int num2) { return num -= num2; } }
?Apple 苹果类:
package eating; import java.util.concurrent.TimeUnit; class Apple implements Runnable { private AppleNum appleNum; public Apple(AppleNum appleNum) { this.appleNum = appleNum; } @Override public void run() { while (true) { synchronized (this) { if (appleNum.getNum() > 0) { appleNum.setNum(1); System.out.println(Thread.currentThread().getName() + "拿了第" + appleNum.getNum() + "个苹果"); try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }
ps:线程安全?非线程安全?什么是线程同步?
线程不安全:在不提供加锁机制保护时,出现了多个线程先后更新数据所得的数据是脏数据。举例子:买票时,如果不排队,抢着买票,A看到票数是100(B也马上看到了,在A买之前,B看到的票数也是100),A买了,则站在A的角度,这时候票数更新为99,然后B也来买,则站在B的角度,票数应该为99(因为B看到的票数是100). 明明被买了两张票,结果票数却是99.
线程同步:当线程们访问同一个共享资源时,需要通过线程同步机制,当第一个线程进去时,就把共享资源进行加锁,然后同步资源的状态给后边进去的线程。 线程同步的是把前一个线程更新后的状态传递给下一位线程。
? 线程同步其实实现的是线程排队。防止线程同步访问共享资源造成冲突。变量需要同步,常量不需要(常量存放于方法区)。
参考:
https://www.cnblogs.com/xrq730/p/6662232.html
java线程同步 synchronized失效???(理解好是否上锁的是同一个对象)
原文:https://www.cnblogs.com/shan333/p/14788184.html