重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
你这样写肯定同步不了。一个对象含有一个隐藏的锁和隐藏的条件,你这样
创新互联建站专注于荔城企业网站建设,响应式网站设计,成都商城网站开发。荔城网站建设公司,为荔城等地区提供建站服务。全流程定制制作,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务
synchronized(newObject())
{
}这种写法
每次都会生成一个新对象,就等于每个线程都能获得这个新对象的锁,所以根本无法做到同步
你的这句话放在run方法里面了:Object b=new Object();
是局部变量,一直在变化,造成锁一直在变化,所以出现了问题。
package ergouge.thread.demo;
/*
nbsp;多线程模拟售票:三个窗口售票20张
nbsp;*/
class Ticket implements Runnable {
nbsp;nbsp;nbsp;nbsp;private int num = 20;
nbsp;nbsp;nbsp;nbsp;final String s = "hell";
nbsp;nbsp;nbsp;nbsp;public void run() { // 覆盖run方法
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;sell();
nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;// 解决线程安全
nbsp;nbsp;nbsp;nbsp;public void sell() {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// synchronized (new Object()) { // 同步代码块,防止多个线程进入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 同步代码块,防止多个线程进入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;while (num gt; 0) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 放到这里也不行 synchronized(new Object()) { //
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 同步代码块,防止多个线程进入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;synchronized (s) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;try {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread.sleep(500);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;} catch (InterruptedException e) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;} // 让线程sleep 0.5秒,测试线程安全问题
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;System.out.println(Thread.currentThread().getName() + "...sell ticket " + num--);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;}
}
public class TicketSale {
nbsp;nbsp;nbsp;nbsp;public static void main(String[] args) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Ticket x = new Ticket();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t1 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t2 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t3 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t1.start();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t2.start();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t3.start();
nbsp;nbsp;nbsp;nbsp;}
}
楼主你仔细看下我该了以后的代码,先找到区别
有两点楼主要注意:
一、synchronized(newObject())相当于没有同步,同步的是同一块内存地址,你这样的话,每次都不是同一块内存地址,因此相当于没有同步
二、同步的范围:同步的范围不是越大越好,仔细想想看吧楼主,你的同步范围太大了
你说的更改权限为640和你后面的代码并不一致,理论上应该有直接以数字为参数的方法吧?
还有注意检查运行java代码的当前用户是哪个?因为权限涉及到当前用户。
原因是你编译使用的javac,把代码编译成版本61的class,而你的运行环境java,是一个老版本,能执行的上限是52版本。
解决方法有两个:
1,安装和JDK相同版本的Java运行时(JRE),并正确设置PATH变量。验证方法是:
在黑窗口里分别输入java -version和javac -version,两个版本要一致,或者java的版本更高。
相关命令截图如下:
2,编译的时候指定运行时的版本:使用--release参数指定版本。
例如,你通过 java -version查看到版本=8,那么就按如图的命令编译